首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MVC,MOQ单元测试Web方法

MVC,MOQ单元测试Web方法
EN

Stack Overflow用户
提问于 2017-06-28 13:30:43
回答 1查看 2K关注 0票数 1

我一直遵循使用MOQ测试我的Web方法的常规模式。这一次,我有一个有点不同的控制器方法,我不知道为什么测试失败。

这是我们其中一种方法的标准外观。我们调用存储库并返回OK。

API方法

代码语言:javascript
复制
    [HttpPost]
    public IHttpActionResult SampleMethod(SampleModel model)
    {
        var result= _myRepository.SampleMethod(model.Field1, model.Field2);

        return Ok();
    }

对于这种情况,我通常使用以下测试。

单元测试

代码语言:javascript
复制
    /// <summary>
    /// Tests the SampleMethod is run
    /// </summary>
    [TestMethod]
    public void SampleMethod_Is_Run()
    {
        //Arrange
        mockRepository
          .Setup(x => x.SampleMethod(It.IsAny<string>(), It.IsAny<string>()))
          .Returns(It.IsAny<EmailItem>());  //forgot to add this the first time
        var controller = new MyController(mockRepository.Object);

        //Act
        controller.SampleMethod(It.IsAny<string>(), It.IsAny<string>());

        //Assert
        mockRepository.VerifyAll();
    }

    /// <summary>
    /// Tests the SampleMethod returns correct status code
    /// </summary>
    [TestMethod]
    public void SampleMethod_Returns_OK()
    {
        //Arrange
        mockRepository
          .Setup(x => x.SampleMethod(It.IsAny<string>(), It.IsAny<string>()))
          .Returns(It.IsAny<EmailItem>());  //forgot to add this the first time;
        var controller = new MyController(mockRepository.Object);
        controller.Request = new HttpRequestMessage();
        controller.Configuration = new HttpConfiguration();

        //Act
        var response = controller.SampleMethod(It.IsAny<string>(), It.IsAny<string>());

        //Assert
        Assert.IsInstanceOfType(response, typeof(OkResult));
    }

现在,假设我有这样一个方法,它调用另一个类发送电子邮件。为什么那些单元测试不能继续工作了?

新API方法

代码语言:javascript
复制
    [HttpPost]
    public IHttpActionResult SampleMethod(SampleModel model)
    {
        var emailItem= _myRepository.SampleMethod(model.Field1, model.Field2);

        //With this additional code, the test will fail
        EmailSender emailSender = new EmailSender();
        emailSender.BuildEmail(emailItem.ToAddress, emailItem.Subject);

        return Ok();
    }

我得到的关于测试失败的错误消息是这样的,但是在哪里看不到额外的异常信息。

代码语言:javascript
复制
    "System.Web.Http.HttpResponseException: Processing of the HTTP request resulted in an exception.  Please see the HTTP response returned by 'Response' property of this exception for details."
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-28 13:42:03

您确实设置了存储库,但不返回任何内容。

代码语言:javascript
复制
mockRepository
      .Setup(x => x.SampleMethod(It.IsAny<string>(), It.IsAny<string>()));

你应该试着:

代码语言:javascript
复制
 mockRepository
      .Setup(x => x.SampleMethod(It.IsAny<string>(), It.IsAny<string>())).Returns(new EmailItem{ToAddress = "", Subject = ""});

你在努力阅读

代码语言:javascript
复制
emailSender.BuildEmail(emailItem.ToAddress, emailItem.Subject);

您没有设置它,所以emailSender是空的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44803961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档