【发布时间】:2026-02-13 11:45:01
【问题描述】:
我试图在 getMethod(string id) 的单元测试中检查的 ContentResult 总是返回 null。控制器调用的Service返回DTO Model。
我试过了 操作结果为 OkNegotiatedContentResult 操作结果为 OkNegotiatedContentResult
单元测试:
[TestMethod]
public void GetUserInformation_ReturnsUserDetails()
{
//Arrange
UserDetails userDetails = new UserDetails();
mockUserService.Setup(x =>
x.GetuserInformation(It.IsAny<string>
())).Returns(userDetails);
//Act
IHttpActionResult result =
userController.GetUserInformation("226");
var contentResult = result as
OkNegotiatedContentResult<UserDetails>;
//Assert
//Validate Ok Result
Assert.IsNotNull(contentResult);//this fails
Assert.IsNotNull(contentResult.Content);
Assert.AreEqual("226", contentResult.Content.userID);
Assert.IsInstanceOfType(result,
typeof(OkNegotiatedContentResult<UserDetails>));//this assert works
}
控制器:
public IHttpActionResult GetUserInformation(string userID)
{
if (!string.IsNullOrEmpty(userID))
{
var result = _userService.GetUserInformation(userID);
if (result != null)
{
return Ok(result);
}
return InternalServerError();
}
else
{
return BadRequest("User Not Found");
}
}
服务层:
public UserDetails GetUserInformation(string userID)
{
UserDetails userDetails = new UserDetails();
//business logic
return userDetails;
}
ContentNegotiator = '((System.Web.Http.Results.OkNegotiatedContentResult)result).ContentNegotiator' 抛出了“System.InvalidOperationException”类型的异常
Request = '(result as OkNegotiatedContentResult).Request' 引发了“System.InvalidOperationException”类型的异常
【问题讨论】:
-
其实不是单元测试。您不应该调用控制器来测试服务。控制器中不应该有任何业务逻辑。所有逻辑都应该保留在服务中。
-
不,如果您没有任何业务逻辑。你不应该有。
-
您无需模拟即可测试服务。但是通过它的构造函数注入到服务的所有东西都应该被模拟。
-
试图找到一篇好文章。到处都有人在测试控制器。但这只是浪费时间。你最好专注于服务。关于瘦控制器的文章:adamtibi.net/06-2013/you-should-unit-test-your-controller-not
-
@VladimirSerykh 是否可以对没有接口的服务进行单元测试?
标签: c# unit-testing asp.net-apicontroller