Как можно подделать слой моей базы данных в модульном тесте?

У меня есть вопрос о модульном тестировании.

Скажем, у меня есть контроллер с одним методом create, который помещает нового клиента в базу данных:

//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.

Я также могу создать список клиентов в поддельном классе базы данных, но, поскольку будут созданы два разных экземпляра (один в действии контроллера и один в модульном тесте), они не будут взаимодействовать.

Как заставить этот модульный тест работать без базы данных?

РЕДАКТИРОВАТЬ: клиентская служба не подключается напрямую к БД. Он вызывает ClientDataClass, который будет подключаться к базе данных. Таким образом, ClientDatabaseClass будет заменен на подделку

Ответы на вопрос(4)

Ваш ответ на вопрос