2013-01-21 32 views
0

我想添加一个单元测试到我有的认证类。所以,基本上它所做的是我拨打Login,我希望它会返回true,并且副作用会添加一个cookie。如何使用Moq并只检查传入函数的对象的一部分?

这里是我的单元测试至今:

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中表达这个操作。

我该怎么做?

回答

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()); 

这避免了需要你明确地设置您的期望提前,并把它放到一行额外的代码中。

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时必须使用​​。

相关问题