У меня вопрос об модульном тестировании.
Скажем, у меня есть контроллер с одним методом create, который помещает нового клиента в базу данных:
//code a bit shortened
public actionresult Create(Formcollection formcollection){
client c = nwe client();
c.Name = formcollection["name"];
ClientService.Save(c);
{
Клиентский сервис вызовет объект datalayer и сохранит его в базе данных.
Теперь я создаю тестовый скрипт базы данных и перед тестированием устанавливаю свою базу данных в состоянии знания. Поэтому, когда я тестирую этот метод в unit test, я знаю, что в базе данных должен быть еще один клиент и какое его имя. Короче:
ClientController cc = new ClientController();
cc.Create(new FormCollection (){name="John"});
//i know i had 10 clients before
assert.areEqual(11, ClientService.GetNumberOfClients());
//the last inserted one is John
assert.areEqual("John", ClientService.GetAllClients()[10].Name);
Итак, я прочитал, что модульное тестирование не должно бить базу данных, я настроил IOC для классов базы данных, но что тогда? Я могу создать поддельный класс базы данных и заставить его ничего не делать.
Но тогда, конечно, мои утверждения не будут работать, потому что, если я скажу GetNumberOfClients()
, он всегда будет возвращать X, потому что он не имеет взаимодействия с поддельным классом базы данных, используемым в методе Create.
Я также могу создать список клиентов в поддельном классе базы данных, но поскольку будут созданы два разных экземпляра (один в действии контроллера и один в unit test), они не будут иметь взаимодействия.
Каким образом можно сделать эту работу unit test без базы данных?
EDIT: Служба клиентов не подключается напрямую к БД. Он вызывает ClientDataClass, который будет подключаться к базе данных. Таким образом, ClientDatabaseClass будет заменен поддельным