2013-01-21 64 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時必須使用​​。

相關問題