1

コントローラーで呼び出される 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 番目の呼び出しに一致し、返すように指示した値を返すようにするには、何をする必要がありますか?

4

2 に答える 2

1

問題はあなたの所有物にありますpublic UserWithRolesPermissions User { get { new UserWithRolesPermissions(); } }

呼び出すたびに新しいインスタンスが作成されるため、それへの 2 つの参照はそれぞれ新しいインスタンスを受け取りますが、これらは等しくありません。したがって、setup の呼び出しは呼び出しと一致しません。

単一のインスタンスを使用するようにコードを変更した場合、問題なく動作するはずです。

var user = new UserWithRolesPermissions();
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);

もう 1 つのオプションは、インスタンスの比較を行わずに、プロパティのみを照合することです。

UserService.Setup(x => x.BuildLoginCookie(It.Is<User>(u => u.Username == model.Username), model.RememberMe)).Returns(cookie);
于 2012-06-28T19:51:07.433 に答える
0

私はそれを考え出した。2 番目のセットアップを次のように変更したところ、現在は機能しています。

UserService.Setup(x => x.BuildLoginCookie(It.Is<UserWithRolesPermissions>(u => u.Username == User.Username), model.RememberMe)).Returns(cookie);

カスタム クラス オブジェクトか何かを一致させるのに苦労したに違いありません。

于 2012-06-28T19:50:31.063 に答える