NSubstitute–dobra alternatywa dla Moq

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:

image

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.

3 thoughts on “NSubstitute–dobra alternatywa dla Moq”

  1. 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ż.

  2. 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.

Leave a Reply

Your email address will not be published.