如何解决.NET CORE 单元测试 - 存储库的 mockRepo.Setup 总是返回 NULL
我有一个简单的方法,它使用一个接口来调用存储库,方法工作得很好,但是每当我尝试模拟 Login
方法并返回一些假的东西时,它只会为我返回 null。
我的方法
[HttpPost]
public ActionResult<LoginResultviewmodel> Login([FromBody] Userviewmodel model)
{
var result = new LoginResultviewmodel();
var loginResult = _authRepository.Login(new User
{
Email = model.Email,Password = model.Password
});
result.IsLogin = loginResult.IsLogin;
result.User = new Userviewmodel
{
Email = loginResult.User.Email,Id = loginResult.User.Id,};
return Ok(result);
}
这是我的测试
[Fact]
public void Login_Return_User_With_Token()
{
// Arrange
var _fakeLoginResult = new LoginResult
{
Token = "Fake token",User = new User
{
Email = "Fake email"
}
};
var fakeUser = new User { Email = "Fake Email",Password = "Fake Password" };
var fakeUserviewmodel = new Userviewmodel { Email = "Fake Email",Password = "Fake Password" };
var mockRepo = new Mock<IAuthRepository>();
var controller = new AuthController(mockRepo.Object);
mockRepo.Setup(repo => repo.Login(fakeUser)).Returns(_fakeLoginResult);
// Act
var methodResult = controller.Login(fakeUserviewmodel);
// Assert
var testResult = methodResult.Result as OkObjectResult;
Assert.Equal(_fakeLoginResult,testResult.Value);
}
result.IsLogin = loginResult.IsLogin;
中的错误捕获,因为 loginResult
为空。
解决方法
默认情况下,如果模拟成员的设置(期望)与实际调用的不匹配,它将返回 null
。
在这种情况下,设置(预期)使用的是特定的 User
引用(实例)
var fakeUser = new User { Email = "Fake Email",Password = "Fake Password" };
//...
mockRepo.Setup(repo => repo.Login(fakeUser)) //<--
.Returns(_fakeLoginResult);
与调用时创建的不匹配,因此返回 null。
var loginResult = _authRepository.Login(new User //<-- new User created here
{
Email = model.Email,Password = model.Password
});
使用参数匹配器 It.IsAny<User>()
mockRepo.Setup(repo => repo.Login(It.IsAny<User>())).Returns(_fakeLoginResult);
如果调用模拟时参数可以是任何 User
值
或使用 It.Is<User>(predicate)
mockRepo
.Setup(repo => repo.Login(It.Is<User>(u => u.Email == "Fake Email" && u.Password == "Fake Password")))
.Returns(_fakeLoginResult);
如果参数需要匹配特定的 User
特征。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。