Zamiast szyderczy MongoDB, powinno być szyderczy warstwę na szczycie MongoDB.
Możesz rozważyć interfejs, który udostępnia operacje na twoim repozytorium, które są agnostyczne dla baz danych danych. Na przykład, możesz chcieć interfejs, który Abstracts operacji na Student
typów, tak jak poniżej:
public interface IStudentOperations
{
void Add(Student student);
}
Podczas tworzenia innych zależności, może wstrzyknąć wystąpień powyżej interfejsu lub którykolwiek abstrakcje wyższego poziomu wybrać.
Chodzi o to, nie należy wystawiać MongoDB bezpośrednio.
Gdy to zrobisz, możesz sfałszować stworzone interfejsy, mając jedną implementację do testowania przeciwko fałszywej implementacji, a następnie rzeczywistą implementację z własnymi testami, aby sprawdzić, czy operacje na implementacji są poprawne, gdy podstawowa implementacja jest z MongoDB.
Chociaż zdecydowanie jest to possible to mock most of MongoDB's classes (as the methods are virtual
), zyskujesz na tym, że jesteś agnostykiem wytrwałości; Jeśli chcesz przełączyć na CouchDB lub elastyczne wyszukiwanie, nie musisz zmieniać wywołań tych interfejsów, po prostu utworzymy nową implementację.
Ponieważ you are trying to test the implementation of the repository, to są na ogół dobrze, jak już wspomniano wcześniej, większość funkcji MongoDB są virtual
, który jest przyjazny dla większości bibliotek drwiących.
To powiedziawszy, trzeba się upewnić, że zdasz MongoDatabase
do repozytorium (nie tworzyć go w repozytorium) tak, że w badaniach jednostkowych, można utworzyć odpowiedni mock a następnie przekazać do swojej implementacji repozytorium do testowania.
Chociaż zgadzam się z casperOne, że będzie możliwe jest wyśmiewanie klas sterowników MongoDB za pomocą większości szyderczych frameworków, ponieważ metody publiczne są wirtualne. – kfuglsang
Będę używał wzorca repozytorium. W związku z tym muszę udawać wszystkich, oszczędzać i innych. Właśnie dlatego potrzebuję makiety mongo – F0rc0sigan
@kfuglsang Zaktualizowana odpowiedź z korzyściami nie kpiącymi bezpośrednio z MongoDB. – casperOne