2016-01-20 4 views
0

Этот вопрос касается использования XUnit с ADO.NET для приложения «Сделать список» с помощью Nancy. Я надеюсь на некоторое понимание того, почему тест Assert.Equal терпит неудачу, хотя выходы кажутся одинаковыми.Тестирование модуля с помощью XUnit, ADO.NET, SQL Server

У меня есть класс задач с двумя свойствами: id и description.

База данных для этого приложения имеет соответствующую таблицу tasks. Пользовательский ввод используется для описания, а id является автоинкрементным идентификационным столбцом.

Класс Task имеет статическое свойство списка All(). Каждая задача добавляется к All(), и вы можете получить список всех задач, вызвав Task.All().

Вот Task класс:

namespace ToDoList 
{ 
    public class Task 
    { 
    private int id; 
    private string description; 

    public Task(string Description, int Id = 0) 
    { 
     id = Id; 
     description = Description; 
    } 

    public int GetId() 
    { 
     return id; 
    } 


    public string GetDescription() 
    { 
     return description; 
    } 

    public void SetDescription(string newDescription) 
    { 
     description = newDescription; 
    } 

    public static List<Task> All() 
    { 
     List<Task> AllTasks = new List<Task>{}; 

     SqlConnection conn = DB.Connection(); 
     SqlDataReader rdr = null; 
     conn.Open(); 

     SqlCommand cmd = new SqlCommand("SELECT * FROM tasks", conn); 
     rdr = cmd.ExecuteReader(); 

     while(rdr.Read()) 
     { 
     int taskId = rdr.GetInt32(0); 
     string taskDescription = rdr.GetString(1); 
     Task newTask = new Task(taskDescription, taskId); 
     AllTasks.Add(newTask); 
     } 

     conn.Close(); 

     return AllTasks; 
    } 

    public void Save() 
    { 
     SqlConnection conn = DB.Connection(); 
     SqlDataReader rdr; 
     conn.Open(); 

     SqlCommand cmd = new SqlCommand("INSERT INTO tasks (description) OUTPUT INSERTED.id VALUES (@TaskDescription)", conn); 

     SqlParameter testParameter = new SqlParameter(); 
     testParameter.ParameterName = "@TaskDescription"; 
     testParameter.Value = this.GetDescription(); 

     cmd.Parameters.Add(testParameter); 

     rdr = cmd.ExecuteReader(); 

     while(rdr.Read()) 
     { 
     this.id = rdr.GetInt32(0); 
     } 
     conn.Close(); 
    } 

    public static void DeleteAll() 
    { 
     SqlConnection conn = DB.Connection(); 
     conn.Open(); 
     SqlCommand cmd = new SqlCommand("DELETE FROM tasks;", conn); 
     cmd.ExecuteNonQuery(); 
    } 
} 

Я определяю DB.Connection в строке соединения в Startup.cs:

... 
    public class DB 
    { 
    public static SqlConnection Connection() 
    { 
     SqlConnection conn = new SqlConnection("Data Source=(localdb)\\mssqllocaldb;Initial Catalog=todo_test;Integrated Security=SSPI;"); 
     return conn; 
    } 
    } 
... 

Теперь вот тест я использую, чтобы увидеть, если он работает:

namespace ToDoList 
{ 
    public class ToDoTest : IDisposable 
    { 
    [Fact] 
    public void Test_All() 
    { 
     //Arrange 
     var description = "Wash the dog"; 
     var description2 = "Water the plants"; 
     Task testTask = new Task(description); 
     testTask.Save(); 
     Task testTask2 = new Task(description2); 
     testTask2.Save(); 

     //Act 
     List<Task> result = Task.All(); 
     List<Task> testList = new List<Task>{testTask, testTask2}; 

     //Assert 
     Assert.Equal(result, testList); 
    } 

    public void Dispose() 
     { 
     Task.DeleteAll(); 
     } 
    } 
} 

Ou tput в консоли только говорит о том, что тест не пройден:

ToDoList.ToDoTest.Test_All [FAIL] 
    Assert.Equal() Failure 
    Expected: List<Task> [Task { }, Task { }] 
    Actual: List<Task> [Task { }, Task { }] 

Я сделал некоторые консольные журналы, и id s и s description для задач в каждом списке идентичны.

Кроме того, когда я тест с:

List<Task> result = new List<Task>{testTask, testTask2}; 
    List<Task> testList = new List<Task>{testTask, testTask2}; 

Испытание проходит.

Я не совсем уверен, как подойти к этому, чтобы понять, почему тест терпит неудачу. Любые идеи были бы замечательными!

+0

Нецелесообразно сравнивать задачи, как мы можем сказать, что они равны друг другу? Вместо этого вы должны разработать более точные тестовые примеры. Между тем, обычно используется макет услуг в модульном тестировании, в то время как вы оставляете тестирование с SQL Server на более поздних этапах (например, интеграция и UAT). –

+0

Можете ли вы уточнить, что вы подразумеваете под первым предложением? Я хочу проверить, что задачи сохраняются в базе данных и корректно возвращаются. Я не уверен, почему 'result' и' testList' не возвращаются как равные, когда 'All()' возвращает все задачи в базе данных в виде списка. Спасибо за предложение. – jmk22

ответ

0

Для успешного выполнения необходимо выполнить команду Task.Equals(), чтобы добиться успеха, в противном случае будет применена семантика задания по умолчанию.

 Смежные вопросы

  • Нет связанных вопросов^_^