How to check if a method is called?

I have an ICreateService class that has a dependency on ITicketApiAdapter . I tried registering mock ITicketAdaper so that it is entered when I create an anonymous create service.

So, in the setup, I have this register for the ticket adapter:

 Fixture.Register(() => { var ticketApiAdapter = new Mock<ITicketApiAdapter>(); ticketApiAdapter .Setup( x => x.AddTicketComment( It.IsAny<User>(), It.IsAny<Customer>(), It.IsAny<TicketComment>())) .Returns(new SaveResult { Success = true, Id = Fixture.CreateAnonymous<Guid>().ToString() }); return ticketApiAdapter; }); Fixture.Register(() => new CreateService(Fixture.CreateAnonymous<Mock<ITicketApiAdapter>>().Object)); 

In my opinion, this should freeze both ICreateService and Mock<ITicketApiAdapter> so that when I request an anonymous instance, I register it.

I have a test that looks like this:

 [TestMethod] public void CreateServiceCallsAddTicketComment() { var apiTicketAdapter = Fixture.CreateAnonymous<Mock<ITicketApiAdapter>>(); var createTicketRequest = Fixture.CreateAnonymous<CreateTicketComment>(); var createService = Fixture.CreateAnonymous<CreateService>(); var results = createService.CreateTicketComment(createTicketRequest); apiTicketAdapter .Verify(x => x.AddTicketComment( It.IsAny<User>(), It.IsAny<Customer>(), It.IsAny<TicketComment>()), Times.Once()); Assert.IsTrue(results.All(x => x.Success)); Assert.IsTrue(results.All(x => x.Errors.Count == 0)); } 

I expect the apiTicketAdapter to be the one I registered so that I can check if the method is called. If I exit, TicketApiAdapter is called, but Moq says it is not.

Edit

This is the error I get:

CreateServiceCallsAddTicketComment throws an exception: Moq.MockException: the expected call to the layout once, but it was 0 times: x => x.AddTicketComment (It.IsAny (), It.IsAny (), It.IsAny ())

Configured settings: x => x.AddTicketComment (It.IsAny (), It.IsAny (), It.IsAny ()), Times.Never No calls made.

+4
source share
1 answer

When you register a code block, this code block will be called every time the Fixture instance resolves the requested type. This means that it is not frozen. If you want to freeze something, then one of Reloading overloads is often easier to use.

Even better, since you seem to be using Moq, can I suggest using the AutoMoq extension?

This will allow you to rewrite the test for something like this:

 [TestMethod] public void CreateServiceCallsAddTicketComment(new AutoMoqCustomization()); { var fixture = new Fixture().Customize() var apiTicketAdapter = fixture.Freeze<Mock<ITicketApiAdapter>>(); ticketApiAdapter .Setup( x => x.AddTicketComment( It.IsAny<User>(), It.IsAny<Customer>(), It.IsAny<TicketComment>())) .Returns(new SaveResult { Success = true, Id = Fixture.CreateAnonymous<Guid>().ToString() }); var createTicketRequest = fixture.Freeze<CreateTicketComment>(); var createService = fixture.CreateAnonymous<CreateService>(); var results = createService.CreateTicketComment(createTicketRequest); apiTicketAdapter .Verify(x => x.AddTicketComment( It.IsAny<User>(), It.IsAny<Customer>(), It.IsAny<TicketComment>()), Times.Once()); Assert.IsTrue(results.All(x => x.Success)); Assert.IsTrue(results.All(x => x.Errors.Count == 0)); } 

Assuming CreateTicketRequest uses constructor injection or property nesting.

+4
source

Source: https://habr.com/ru/post/1380431/


All Articles