初学者Moq关于验证的问题

时间:2011-09-27 09:44:24

标签: installation moq verify

我只是在玩Moq,我无法弄清楚如何调用Verify按预期工作。我的问题似乎是我调用SUT的方法没有被调用。这是我要测试的代码:

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)
   {

   }
}

这是我的MSpec测试:

[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());
        };
}

这是非常基本的东西,没有什么太花哨的。现在,当我运行测试时,我得到了:

  

模拟上的预期调用至少一次,但从来没有   执行:s =&gt; s.DoPerson(It.IsAny())没有配置任何设置。

我认为这是因为sut.ProcessRequest()实际上没有被调用 - 我在ProcessRequest()的开头有一个断点,但它从未被击中。有人可以告诉我如何设置我的mockSut以便调用ProcessRequest()

干杯。 雅各

1 个答案:

答案 0 :(得分:2)

当您使用Moq创建一个Mock对象时,它将模拟整个对象并将其设置为返回默认值或对每个方法和属性不执行任何操作。所以sut.ProcessRequest实际上不会做任何事情:永远不会调用DoPerson

你只想模拟你想要测试的类的依赖关系,而不是类本身。