Jason Evans
Jason Evans

Reputation: 29186

Beginners Moq question on Verifying

I'm just playing around with Moq and I cannot work out how to get a call to Verify to work as expected. My problem seems to be that the method I'm calling on the SUT is not being called. Here's my code to test:

public class ImageHandler : BaseHttpHandler
{
   public override void ProcessRequest(HttpContextBase context)
   {
       var person = new Person();

       this.DoPerson(person);

       context.Response.ContentType = "image/jpeg";

       if (context.Request.RawUrl.ToLower().Contains("jellyfish.jpg"))
       {
           context.Response.TransmitFile(@"C:\Temp\jf.jpg");
       }
       else if (context.Request.RawUrl.ToLower().Contains("koala.jpg"))
       {
           context.Response.TransmitFile(@"C:\Temp\k.jpg");
       }
       else
       {
           context.Response.Write("File not found.");
       }

   }

   public virtual void DoPerson(Person person)
   {

   }
}

Here is my MSpec test:

[Subject("Process")]
public class When_Given_Person
{
    private static Mock<HttpContextBase> httpContext;

    private static Mock<HttpRequestBase> httpRequest;

    private static Mock<HttpResponseBase> httpResponse;

    private static Mock<ImageHandler> mockSut;

    private static BaseHttpHandler sut;

    private Establish context = () =>
    {
        httpContext = new Mock<HttpContextBase>();
        httpResponse = new Mock<HttpResponseBase>();
        httpRequest = new Mock<HttpRequestBase>();
        mockSut = new Mock<ImageHandler>();

        httpContext.SetupGet(context => context.Response).Returns(httpResponse.Object);
        httpContext.SetupGet(context => context.Request).Returns(httpRequest.Object);

        httpRequest.SetupGet(r => r.RawUrl).Returns("http://logicsoftware/unkown.jpg");

        sut = mockSut.Object;
    };

    private Because of = () => sut.ProcessRequest(httpContext.Object);

    private It should_call_person_with_expected_age = () =>
        {
            mockSut.Verify(s => s.DoPerson(Moq.It.IsAny<Person>()),Times.AtLeastOnce());
        };
}

This is really basic stuff, nothing too fancy. Now, when I run the test I get:

Expected invocation on the mock at least once, but was never performed: s => s.DoPerson(It.IsAny()) No setups configured.

I believe this is due to the fact that sut.ProcessRequest() is not actually called - I have a breakpoint at the start of ProcessRequest(), but it's never hit. Can someone show me how to setup my mockSut so that ProcessRequest() is called.

Cheers. Jas.

Upvotes: 0

Views: 333

Answers (1)

RandomEngy
RandomEngy

Reputation: 15413

When you make a Mock of an object with Moq, it will mock the whole object and set it up to return defaults or do nothing on every method and property. So sut.ProcessRequest, won't actually do anything: DoPerson will never be called.

You'll only want to mock out dependencies to the classes you want to test, never the class itself.

Upvotes: 2

Related Questions