0

私が持っている認証クラスに単体テストを追加しようとしています。したがって、基本的にそれが行うことはLogin、私が呼び出すことであり、それが true を返し、副作用として Cookie を追加することを期待しています。

これまでの私の単体テストは次のとおりです。

var mock=new Mock<IServerContext>(); //AddCookie method is within IServerContext
FSCAuth.Config.Server=mock; //set authentication to use mocked interface
mock.Setup(x=>x.AddCookie(new HttpCookie().Name=="??")); //question here
FSCAuth.Login("foo", "bar", false);
mock.VerifyAll();

私の質問は、AddCookie に渡された引数を確認するにはどうすればよいですか? 基本的に、私がやりたいのは次のようなものです

bool AddCookieVerify(HttpCookie cookie)
{
    return cookie.Name=="foobar"
}

検証関数が false を返す場合は、エラーをスローします。この操作をMoqで表現する方法がわかりません。

どうすればいいですか?

4

2 に答える 2

2

MoqにはIt静的クラスが含まれており、期待する引数のタイプを指定できます。たとえば、プレースホルダー行の代わりに

mock.Setup(x => x.AddCookie(new HttpCookie().Name == "??"));

できるよ

mock.Setup(x => x.AddCookie(It.Is<HttpCookie>(cookie => cookie.Name == "Whatever")));

そして、その式を満たす値が渡されない限り、検証に失敗します。

Setup()また、次のように、後に続くものから、事後にVerifyAll()単に使用するものに切り替えることを考えるかもしれません。Verify()

var mock = new Mock<IServerContext>(); // AddCookie method is within IServerContext
FSCAuth.Config.Server = mock.Object; //set authentication to use mocked interface
FSCAuth.Login("foo", "bar", false);
mock.Verify(x => x.AddCookie(It.Is<HttpCookie>(cookie => cookie.Name == "Whatever")), Times.Once());

これにより、事前に明示的に期待値を設定する必要がなくなり、コードを1行余分に追加できます。

于 2013-01-21T04:53:26.183 に答える
0

以下では、特定の値に設定されたプロパティを持つインスタンスAddCookieを期待するように設定しています。HttpCookieName

var mock=new Mock<IServerContext>(); //AddCookie method is within IServerContext
FSCAuth.Config.Server = mock.Object; //set authentication to use mocked interface
mock.Setup(x => x.AddCookie(It.Is<HttpCookie>(h => h.Name == "foobar"))); //question here
FSCAuth.Login("foo", "bar", false);

mock.VerifyAll();

また、設定時にFSCAuth.Config.ServerMockedInstance.Object.

于 2013-01-21T04:46:20.820 に答える