Mam taki test:
[TestCase("~/page/myaction")]
public void Page_With_Custom_Action(string path) {
// Arrange
var pathData = new Mock<IPathData>();
var pageModel = new Mock<IPageModel>();
var repository = new Mock<IPageRepository>();
var mapper = new Mock<IControllerMapper>();
var container = new Mock<IContainer>();
container.Setup(x => x.GetInstance<IPageRepository>()).Returns(repository.Object);
repository.Setup(x => x.GetPageByUrl<IPageModel>(path)).Returns(() => pageModel.Object);
pathData.Setup(x => x.Action).Returns("myaction");
pathData.Setup(x => x.Controller).Returns("page");
var resolver = new DashboardPathResolver(pathData.Object, repository.Object, mapper.Object, container.Object);
// Act
var data = resolver.ResolvePath(path);
// Assert
Assert.NotNull(data);
Assert.AreEqual("myaction", data.Action);
Assert.AreEqual("page", data.Controller);
}
GetPageByUrl
działa dwa razy DashboardPathResolver
, jak mogę powiedzieć Moq, aby wróciła null
po raz pierwszy i pageModel.Object
drugi?
c#
unit-testing
nunit
moq
Marek
źródło
źródło
SetupSequence()
nie działa zCallback()
. Gdyby tak się stało, można by zweryfikować wywołania wyśmiewanej metody w sposób „automatyczny”.SetupSequence
działa tylko dla dwóch połączeń, ale co mogę zrobić, jeśli potrzebujesz więcej niż dwóch połączeń?SetupSequence
można użyć do dowolnej liczby połączeń. Pierwszy przykład, który podałem, zwraca sekwencję 5 połączeń.Istniejące odpowiedzi są świetne, ale pomyślałem, że rzuciłbym swoją alternatywę, która po prostu wykorzystuje
System.Collections.Generic.Queue
i nie wymaga żadnej specjalnej wiedzy na temat kpiącego frameworka - ponieważ nie miałem żadnej, kiedy to napisałem! :)Następnie...
źródło
Exception
bo nie możeszEnqueue
. AleSetupSequence
zadziała (patrz na przykład odpowiedź @stackunderflow).Dequeue()
zamiast po prostuDequeue
, będziesz poprawny.Dodanie wywołania zwrotnego nie działało dla mnie, zamiast tego zastosowałem to podejście http://haacked.com/archive/2009/09/29/moq-sequences.aspx i skończyłem z takim testem:
źródło
Podczas konfigurowania próbnego obiektu można użyć wywołania zwrotnego. Spójrz na przykład z Moq Wiki ( http://code.google.com/p/moq/wiki/QuickStart ).
Twoja konfiguracja może wyglądać następująco:
źródło
Setup()
ponowne wykonanie połączenia iReturn()
podanie innej wartości.Teraz możesz użyć SetupSequence. Zobacz ten post: http://codecontracts.info/2011/07/28/moq-setupsequence-is-great-for-mocking/
źródło
Osiągnięto tutaj ten sam problem z nieco innymi wymaganiami.
Muszę uzyskać różne zwracane wartości od próbnego opartego na różnych wartościach wejściowych i znaleźć rozwiązanie, które IMO jest bardziej czytelne, ponieważ używa składni deklaratywnej Moq (linq to Mocks).
źródło
da.GetFromDb(0) == new Account { ..None.. && da.GetFromDb(1) == new Account { InActive } && ...
, nieIt.Is
wymagającą-lambda w ogóle.Odpowiedź akceptowana , jak również odpowiedź SetupSequence , uchwyty powrocie stałe.
Returns()
ma pewne przydatne przeciążenia, w których można zwrócić wartość na podstawie parametrów wysłanych do próbnej metody. W oparciu o rozwiązanie podane w zaakceptowanej odpowiedzi, oto kolejna metoda rozszerzenia dla tych przeciążeń.Niestety użycie tej metody wymaga określenia niektórych parametrów szablonu, ale wynik jest nadal dość czytelny.
Tworzenie przeciążeń dla metodę rozszerzenia z wieloma parametrami (
T2
,T3
itp), w razie potrzeby.źródło