コントローラーで呼び出される 2 つのサービス呼び出しをモックするテストがあります。最初の呼び出し (ユーザー POCO) の戻り値は、2 番目の呼び出しに使用されます。問題は、null を返し続けるため、秒に一致していないように見えることです。User オブジェクトの代わりに文字列を返すようにサービスを変更すると、正常に動作します。
テスト:
[Test]
public void GivenExternalReturnUrl_ReturnsHomePage()
{
var model = new Login
{
Username = "user1",
Password = "password1",
ReturnUrl = "http://google.com"
};
UserService.Setup(x => x.ValidateUser(model.Username, model.Password)).Returns(User);
var cookie = new HttpCookie("test");
UserService.Setup(x => x.BuildLoginCookie(User, model.RememberMe)).Returns(cookie);
var result = Controller.Login(model) as RedirectToRouteResult;
result.Should().Not.Be.Null();
result.RouteValues["controller"].Should().Equal("Home");
result.RouteValues["action"].Should().Equal("Index");
UserService.Verify(x => x.BuildLoginCookie(User, model.RememberMe), Times.Once());
}
BuildLoginCookie は、Cookie オブジェクトではなく null を返しています。
テストしているアクション:
[HttpPost]
public ActionResult Login(Login model)
{
if (ModelState.IsValid)
{
var user = _userService.ValidateUser(model.Username, model.Password);
if (user != null)
{
var cookie = _userService.BuildLoginCookie(user, model.RememberMe);
Response.Cookies.Add(cookie);
if (Url.IsLocalUrl(model.ReturnUrl))
return Redirect(model.ReturnUrl);
return RedirectToAction("Index", "Home");
}
ModelState.AddModelError("InvalidCredentials", "The user name or password provided is incorrect.");
}
// If we got this far, something failed, redisplay form
model.Password = null; //clear the password so they have to re-enter it
return View(model);
}
Moq がその 2 番目の呼び出しに一致し、返すように指示した値を返すようにするには、何をする必要がありますか?