У меня вопрос по модульному тестированию.
Скажем, у меня есть контроллер с одним методом создания, который помещает нового клиента в базу данных:
//code a bit shortened
public actionresult Create(Formcollection formcollection){
client c = nwe client();
c.Name = formcollection["name"];
ClientService.Save(c);
{
Clientservice будет вызывать объект слоя данных и сохранять его в базе данных.
Теперь я создаю тестовый скрипт базы данных и устанавливаю базу данных в известное состояние перед тестированием.
Поэтому, когда я тестирую этот метод в модульном тесте, я знаю, что в базе данных должен быть еще один клиент и как его зовут. Короче:
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.
Я также могу создать список клиентов в поддельном классе базы данных, но, поскольку будут созданы два разных экземпляра (один в действии контроллера и один в модульном тесте), они не будут взаимодействовать.
Как заставить этот модульный тест работать без базы данных?
EDIT:
Клиентская служба не подключается напрямую к БД. Он вызывает ClientDataClass, который будет подключаться к базе данных. Таким образом, ClientDatabaseClass будет заменен на фальшивку