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,则抛出错误。我不明白如何在起订量中表达这个操作。

我该怎么做呢?

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()follow by切换到事后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());

这避免了您需要提前明确设置您的期望,并将其简化为一行额外的代码。

于 2013-01-21T04:53:26.183 回答
0

下面您将设置AddCookie为期望任何将属性设置为特定值HttpCookie的实例。Name

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.Server时必须使用MockedInstance.Object.

于 2013-01-21T04:46:20.820 回答