我试图将单元测试添加到我拥有的身份验证类。基本上它所做的是,我调用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中如何表达这个操作。
我该怎么做?
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());
这避免了您提前显式设置期望的需要,并将其简化为额外的一行代码。
下面您将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
.