我如何设置一个模拟返回IHttpActionResult

本文关键字:一个 模拟 返回 IHttpActionResult 设置 何设置 | 更新日期: 2023-09-27 18:07:20

我使用VisualStudio 2015, . net 4.6, Moq 4.5.2, Nunit 3.4.1来测试WebApi2控制器。然而,当模拟预期的控制器方法时,我得到一个null响应对象:

var response = actionResult as NegotiatedContentResult;

我猜我必须设置我的模拟UserService不正确?

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

userServiceMock。设置(service => service)。InsertOrUpdateUser (It.IsAny()))。返回(1);

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

' ((System.Web.Http.Results.OkNegotiatedContentResult) actionResult) .Request '抛出类型为"System"的异常。InvalidOperationException '

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

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

1)我是否正确设置了Moq和

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

谢谢。

下面是Test方法:

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

我如何设置一个模拟返回IHttpActionResult

根据你的代码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);失败,因为强制转换将导致response成为null

给定测试的断言,那么您将不得不更新控制器的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);