繁体   English   中英

如何设置返回 IHttpActionResult 的模拟?

[英]How do I setup a mock that returns IHttpActionResult?

我正在使用 VisualStudio 2015、.NET 4.6、Moq 4.5.2、Nunit 3.4.1 来测试 WebApi2 控制器。 但是,在模拟预期的控制器方法时,我得到了一个null响应对象:

var response = actionResult as NegotiatedContentResult;

我猜我一定是错误地设置了我的UserService模拟?

我怀疑这部分是罪魁祸首:

userServiceMock.Setup(service => service.InsertOrUpdateUser(It.IsAny()))。 退货(1);

当我在输出窗口中得到以下内容时:

'((System.Web.Http.Results.OkNegotiatedContentResult)actionResult).Request'抛出了一个'System.InvalidOperationException'类型的异常

问题是我告诉 Moq 期望返回值为 1,但 Put 方法返回OkNegotiatedContentResult吗?

我的问题是(可能是同一个问题):

1)我是否正确设置了我的起订量并且

2)如何解决问题,以便填充我的响应对象?

非常感谢。

下面是测试方法:

[Test]
public void Put_ShouldUpdate_User()
{
    // Arrange
    var userServiceMock = new Mock<IUserService>();

    userServiceMock.Setup(service => service.InsertOrUpdateUser(
        It.IsAny<User>())).Returns(1);

    var controller = new UsersController(userServiceMock.Object);

    // Act
    IHttpActionResult actionResult = controller.Put(

        new User()
        {
            Id = 1,
            Name = "Joe"
        });

    var response = actionResult as NegotiatedContentResult<User>;

    // Assert:
    Assert.IsNotNull(response);
    var newUser = response.Content;
    Assert.AreEqual(1, newUser.Id);
    Assert.AreEqual("Joe", newUser.Name);
}

这是UserController方法:

// PUT api/users/1
public IHttpActionResult Put(User user)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    return Ok(_userService.InsertOrUpdateUser(user));

}

最后,UserService的方法:

public int InsertOrUpdateUser(User user)
{
    return _userRepository.InsertOrUpdateUser(user);
}

根据您的代码IUserService

public interface IUserService {

    int InsertOrUpdateUser(User user);

}

它返回一个int

如果您在控制器中执行以下操作

return Ok(_userService.InsertOrUpdateUser(user));

然后基于接口和您的设置模拟,将返回OkNegotiatedContentResult<int>的响应类型。 但是在你的测试中你这样做

var response = actionResult as NegotiatedContentResult<User>;

您将返回的结果转换为NegotiatedContentResult<User>这将导致Assert.IsNotNull(response); 失败,因为转换将导致responsenull

鉴于您的测试断言,那么您必须更新控制器的Put方法以在模拟操作之后返回User user ,如下所示...

public IHttpActionResult Put(User user) {
    if (!ModelState.IsValid) {
        return BadRequest(ModelState);
    }
    var count = _userService.InsertOrUpdateUser(user);
    if(count == 1)
        return Ok(user);
    else
        return BadRequest(); // 500 (Internal Server Error) you choose. 
}

并更新测试如下

//...other code removed for brevity

var response = actionResult as OkNegotiatedContentResult<User>;

// Assert:
Assert.IsNotNull(response);
var newUser = response.Content;
Assert.AreEqual(1, newUser.Id);
Assert.AreEqual("Joe", newUser.Name);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM