Qual é o caminho a seguir para falsificar minha camada de banco de dados em um teste de unidade?

Eu tenho uma pergunta sobre teste de unidade.

Digamos que eu tenho um controlador com um método de criação que coloca um novo cliente no banco de dados:

//code a bit shortened
public actionresult Create(Formcollection formcollection){
    client c = nwe client();
    c.Name = formcollection["name"];
    ClientService.Save(c);
{

O serviço de cliente chamaria um objeto de camada de dados e o salvaria no banco de dados.

O que faço agora é criar um script de teste do banco de dados e definir meu banco de dados em uma condição conhecida antes do teste. Portanto, quando testo esse método no teste de unidade, sei que deve haver mais um cliente no banco de dados e qual é o nome dele.

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);

Então, eu li que o teste de unidade não deveria estar atingindo o banco de dados, configurei um COI para as classes de banco de dados, mas e daí? Eu posso criar uma classe de banco de dados falsa e fazê-la não fazer nada.

Mas é claro que minhas afirmações não funcionarão porque se eu disserGetNumberOfClients() ele sempre retornará X porque não tem interação com a classe de banco de dados falsa usada no método Create.

Também posso criar uma Lista de clientes na classe de banco de dados falso, mas como haverá duas instâncias diferentes criadas (uma na ação do controlador e outra no teste de unidade), elas não terão interação.

Qual é a maneira de fazer esse teste de unidade funcionar sem um banco de dados?

EDIT: O serviço ao cliente não se conecta diretamente ao banco de dados. Ele chama um ClientDataClass que se conectará ao banco de dados. Portanto, o ClientDatabaseClass será substituído por um falso

questionAnswers(4)

yourAnswerToTheQuestion