【发布时间】:2020-01-12 06:19:15
【问题描述】:
已经一整天了,我无法找到解决方案。 从 PostMan 调用时,我的 Controller 的 ActionMethod 工作正常。 但是当我从我的单元测试方法中调用它时,它一直返回 null。
这是我的代码。
我已经在 StackOverflow 上找到了答案:
https://stackoverflow.com/a/56498657/11425180
但这并不能解决我的问题。
这是我的操作方法
[HttpPost("register")]
public async Task<IActionResult> RegisterUser([FromBody] CreateUserRequest request)
{
if (!ModelState.IsValid)
return BadRequest(ModelState);
try
{
// Map request with dto and give to service
CreateUserRequestDto createDto = _mapper.Map<CreateUserRequestDto>(request);
CreateUserResponseDto response = await _userService.CreateUser(createDto);
if (response.IsSuccess)
{
Success success = new Success(message: SuccessMessages.UserCreated, data: response);
return Ok(success);
}
Error error = new Error(message: ErrorMessages.UserRegistrationFailed, description: response.Error.Description);
return BadRequest(error);
}
catch (Exception ex)
{
return HandleException(ex);
}
}
这是我的测试类
public class MockAccountControllerTests
{
readonly UserController _accountController;
public MockAccountControllerTests()
{
Mock<IMapper> _mockMapper = new Mock<IMapper>();
Mockers.InitializeMappers(_mockMapper);
UserManager<AppUser> _mockUserManager = Mockers.MockUserManager<AppUser>().Object;
UserRepository _mockUserRepository = new Mock<UserRepository>(_mockUserManager, _mockMapper.Object).Object;
UserService _mockUserService = new Mock<UserService>(_mockUserRepository).Object;
_accountController = new Mock<UserController>(_mockUserService, _mockMapper.Object).Object;
}
[Fact]
public async Task RegisterUser_NullUserNamePassword_ThrowsException()
{
CreateUserRequest request = RequestHelpers.CreateUserRequest(null, null);
IActionResult result = await _accountController.RegisterUser(request);
ObjectResult badRequest = result as ObjectResult;
Assert.NotNull(badRequest);
Assert.True(badRequest is BadRequestObjectResult);
Assert.Equal(StatusCodes.Status400BadRequest, badRequest.StatusCode);
Assert.NotNull(badRequest.Value);
Assert.IsType<Error>(badRequest.Value);
}
}
在我的测试方法中的这一行
var result = await _accountController.RegisterUser(request);
result 是 null
我还尝试将 BadRequest 的值分配给这样的变量
var a = BadRequest("Test Message");
在这种情况下,a 也是 null。
这将如何纠正? 我在 ActionMethod 或 TestMethod 中做错了吗? 请查看。
【问题讨论】:
-
阅读How to Ask 并提供minimal reproducible example。你如何初始化你的
_accountController?HandleException()返回什么?您是否尝试过调试您的测试并单步执行您的代码? -
result.GetType的值是多少(查看Immediate Window)? -
听着,如果
await _accountController.RegisterUser(request)返回null,那么问题出在你的代码中。在单元测试中,很多 ASP.NET 管道根本没有运行,因此它无法与使用 PostMan 向正在运行的 API 发出请求相提并论。再说一遍:展示你如何初始化_accountController,并单步执行其代码以查看null的返回位置。我不是很聪明,我是根据多年在 ASP.NET(MVC(核心))中构建和测试的经验告诉你问题出在你的代码中。 -
我不会感到惊讶,例如,如果您的
_accountController由new Mock<AccountController>().Object初始化,因为BadRequest()永远不会返回null。测试模拟是错误的方法,你模拟依赖,而不是被测系统。所以别再在 cmets 和我吵架了,edit 你的问题会展示你的整个测试课。 -
@ArslanMunir 这样做的寓意是,如果你没有在minimal reproducible example 中向我们展示全貌,那么你最终会浪费那些自愿帮助你解决问题的人的时间你的 问题,不必要的来回。
标签: c# unit-testing asp.net-core asp.net-core-webapi