Uświadom sobie to może brzmieć jak szerokie pytanie - więc pozwól mi wyjaśnić. Mam repozytorium odsłonięte przez interfejs, z dwoma konkretnymi implementacjami - MockRepository i EntityFrameworkRepository.Jak prawidłowo wykonać testy jednostkowe operacji CRUD w repozytorium?
Teraz mam projekt testu jednostkowego, dla którego wszystkie testy można uruchomić pod repozytorium albo, przeskakując przez linię w [TestInitialize]
.
Moje pytanie jest w zasadzie "Jak powinienem napisać testy".
Oto co mam:
C Reate
// Arrange.
var foo = new Foo { .. };
// Act
Repository.Add(foo);
UnitOfWork.Commit();
// Assert
Assert.IsTrue(foo.Id > 0);
R etrieve
// Arrange.
var fooToGet = 1;
// Act
var foo = Repository.FindSingle(fooToGet);
// Assert
Assert.IsNotNull(foo);
Assert.AreEqual(foo.Id, fooToGet);
U activeupdate
// Arrange.
var fooToGet = 1;
var nameToChangeFooTo = "FooBar";
// Act
var foo = Repository.FindSingle(fooToGet);
foo.Name = nameToChangeFooTo;
UnitOfWork.Commit();
var fooRetrievedAgain = Repository.FindSingle(fooToGet);
// Assert
Assert.IsNotNull(foo);
Assert.AreEqual(fooRetrievedAgain.Id, fooToGet);
Assert.AreEqual(fooRetrievedAgain.Name, nameToChangeFooTo);
D suĹ
// Arrange.
var fooToGet = 1;
// Act
var foo = Repository.FindSingle(fooToGet);
Repository.Remove(foo);
UnitOfWork.Commit();
var fooRetrievedAgain = Repository.FindSingle(fooToGet);
// Assert
Assert.IsNull(fooRetrievedAgain);
To działa ok, zarówno dla Mock i EF repozytorium, ale moim głównym problemem jest to C (Create). Nie wiem, jak przetestować operację dodawania w moim repozytorium. Nie czuje się dobrze co robię.
Przekazuje dla repozytorium EF, ale aby przekazać go w moim próbnym repozytorium musiałem użyć odbicia, aby zaktualizować identyfikator w zbiorze w pamięci (nieprzyjemnym).
Więc, czy możesz podzielić się radą na temat prawidłowych sposobów testowania operacji CRUD na schemacie repozytorium?
To aplikacja ASP.NET MVC, .NET 4, C#, Entity Framework 4 i Unit of Work/Repository Patterns.
Dzięki.
EDIT
prostu do wyjaśnienia facetów, nie są wszystko posiadaczami jednostek testy mam. Mam testy jednostkowe dla mojej warstwy usługi, a także testy reguł biznesowych.
Oba te elementy będą (i powinny) się nie powieść, jeśli powyższe testy repozytorium zawiodą. Na tym polega testowanie jednostkowe podstawowych operacji z moich repozytoriów. Czy się mylę?
Co tu testujesz? Pachnie, jakbyś testował ze względu na pisanie testów. – jfar
@jfar - faktycznie napisałem te testy zanim zaimplementowałem repozytoria (TDD). Mówisz, że nie przejmujesz się testowaniem swoich repozytoriów? Pomyśl o tym, jak wiele "bezsensownych" błędów można znaleźć w testowaniu biznesowym/systemowym. Ktoś może (i powinien) być podświetlony podczas testrun z kompilacją CI. Nie sądzisz? – RPM1984
I pamiętaj, testuję przez 'interfejsy'. 'Repozytorium' jest typu' IRepository '. Więc wszystko, co próbuję zrobić, to upewnić się, że moje repozytoria są w stanie wykonywać podstawowe operacje na magazynie pamięci trwałej (czy to sklep to repozytorium symulowane w pamięci czy repozytorium EF). –
RPM1984