.NET CORE单元测试-mockRepo.存储库的安装程序总是返回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。

默认情况下,如果模拟成员的设置(期望值(与实际调用的不匹配,它将返回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);

如果自变量需要匹配特定的CCD_ 9特性。

参考最小起订量快速启动:匹配参数

最新更新