初学者关于验证的最小起订量问题

发布于 2024-12-06 10:52:51 字数 2341 浏览 0 评论 0原文

我只是在玩 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 => s.DoPerson(It.IsAny()) 未配置任何设置。

我相信这是由于 sut.ProcessRequest() 实际上并未被调用 - 我在 ProcessRequest() 的开头有一个断点,但它从未被命中。有人可以告诉我如何设置我的mockSut 以便调用ProcessRequest() 吗?

干杯。 贾斯。

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.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

爱已欠费 2024-12-13 10:52:51

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

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

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文