Zwykle używałem Moq w swoich projektach, ale ostatnio miałem do czynienia z NSubstitute i jego składnia dużo bardziej podoba mi się.
Standardowo instalujemy pakiet NuGet:
Załóżmy, że mamy interfejs:
interface IPersonRepository { Person GetById(int personId); void Add(Person person); }
Konfiguracja metod jest bardzo prosta i naturalna:
IPersonRepository personRepositoryMock = Substitute.For<IPersonRepository>(); personRepositoryMock.GetById(1).Returns(new Person() { FirstName = "test" }); Person person = personRepositoryMock.GetById(1);
W przypadku Moq, mamy do czynienia z wyrażeniami lambda, które nie są aż tak bardzo przejrzyste jak powyższy kod.
Podobnie sprawa wygląda z weryfikacją, czy jakaś metoda została wykonana:
personRepositoryMock.Received(5).GetById(Arg.Any<int>());
Analogiczną metodą jest DidNotReceived:
personRepositoryMock.DidNotReceive().GetById(Arg.Any<int>());
Możliwe jest również odpalenie zdarzenia za pomocą Raise.EventWith:
IPersonRepository personRepositoryMock = Substitute.For<IPersonRepository>(); bool wasCalled = false; personRepositoryMock.SampleEvent += (sender, args) => wasCalled = true; personRepositoryMock.SampleEvent += Raise.EventWith(new object(), new EventArgs());
Ze względu, że nie mamy do czynienia z lambda, wsparcie ze strony resharper jest lepsze i moim zdaniem łatwiej robić TDD.
Nie rozumiem gdzie widzisz problem z Moq. Ja go bym użył tak:
var mockedObject = Mock.Of( p => p.GetById(It.IsAny()) == new Person() { FirstName = “test” });
I już.
sory coś się źle wkleiło, tutaj poprawny przykład:
http://pastebin.com/T1GsbeaG
Też ostatnio przeszedłem na NSubstitute z Moq i póki co sobie chwalę.
@Qba Oczywiście, że w Moq również da się zrobić taką konstrukcję. Tyle że w NSubstitute wygląda to według mnie czytelniej.