Этот вопрос касается использования 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};
Испытание проходит.
Я не совсем уверен, как подойти к этому, чтобы понять, почему тест терпит неудачу. Любые идеи были бы замечательными!
Нецелесообразно сравнивать задачи, как мы можем сказать, что они равны друг другу? Вместо этого вы должны разработать более точные тестовые примеры. Между тем, обычно используется макет услуг в модульном тестировании, в то время как вы оставляете тестирование с SQL Server на более поздних этапах (например, интеграция и UAT). –
Можете ли вы уточнить, что вы подразумеваете под первым предложением? Я хочу проверить, что задачи сохраняются в базе данных и корректно возвращаются. Я не уверен, почему 'result' и' testList' не возвращаются как равные, когда 'All()' возвращает все задачи в базе данных в виде списка. Спасибо за предложение. – jmk22