我如何设置一个模拟返回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);
}
根据你的代码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);