2009-10-07 57 views
2

我在Dimecasts.net上觀看了Introduction to Moq video。在視頻中,當人建立自己的起訂量的測試,他有下面的代碼:這個Moq測試如何工作主要關於linq語法?

[Test] 
public void TestWithMock() 
{ 
    var mockEmailService = new Mock<IEmailService>(); 

    mockEmailService.Expect(x => 
    x.SendEmail(It.IsAny<string>,It.IsAny<string>)).Returns(true); 

    var emailer = new Emailer(mockEmailService.Object); 

    emailer.SendBatchEmails(); 
} 

這裏是我的問題:

1)通過所有不同類型的字符串測試SendBatchEmails方法是否起訂量環? 我想我對如何嘲笑作品有點困惑。

2)有人可以解釋Expect部分的lambda語法嗎? 3)作者首先在SendEmail函數中有「」,「」,但是失敗了,所以他把 It.IsAny<string>,但是我仍然不清楚爲什麼它以「」,「」失敗。

Stackoverflow未將字符串關鍵字放在尖括號中。 (固定)

回答

4

1)Moq不會影響SendBatchEmails的工作方式,因爲您不是在嘲笑Emailer類。相反,您正在嘲笑IEmailService接口,因此如果Emailer類調​​用IEmailService對象上的方法,則Moq將捕獲這些調用。

2)您正在告訴Moq您期待調用IEmailServiceSendEmail方法。你也告訴Moq當SendEmail被調用時,你想讓Moq自動返回true

由於Moq對象被傳遞到Emailer類,因此此測試將測試SendBatchEmails中的代碼是否調用SendEmail方法。

3)只有參數匹配才能實現預期。如果您告訴Moq您期望SendEmail"", ""作爲參數調用,SendEmail以不同的字符串調用,則它將失敗。 It.IsAny<string>()告訴Moq匹配期望與任何字符串作爲參數。

+1

+1。還要注意,這並不真正測試任何東西 - 沒有斷言,期望也沒有Verifiable,也沒有調用mockEmailService.Verify()。 (我通常會進行狀態測試,但在這裏可能需要進行行爲測試。) – TrueWill 2009-10-07 23:04:45

+0

感謝您的解釋。 – Xaisoft 2009-10-07 23:36:52

1

它不循環任何字符串,設置的期望將簡單地匹配調用SendEmail時給出的任何字符串,並返回真實結果。預期內的lambda在設置期望的對象上設置函數調用匹配,在這種情況下爲mockEmailService。這裏的變量x代表了期望主體對象的價值。它將在該對象上匹配的方法是SendEmail,並且當使用任何字符串參數調用SendEmail時,它將進一步匹配。預期的調用發生時,它將返回值true。

大概是最初失敗的原因是SendEmail被一對不匹配「」,「」的參數調用。這意味着期望沒有得到滿足,因此它沒有迴歸真實。未達到預期的事實可能未通過測試,但也可能是由於SendBatchEmail在該方法返回false時失敗。

1

1)你是什麼意思,不同類型的字符串?只有一種類型的字符串...這是字符串。

模擬做的是自動創建一個新的對象類型,它實現了所提供的接口或抽象類。在這種情況下,Moq將生成一個新的類類型,其名稱類似於「IEmailService_a324bc54ff123827d」。這種類型將實現IEmailService接口的所有方法返回null。

3)我會先回答(2)。 「」,「」失敗的原因是因爲它已經註冊了對mockEmailService.SendMail(「」,「」)的預期調用。如果使用其他參數調用,則期望會失敗。使用IsAny()意味着你不關心參數值,你只是期望方法調用發生。

最後,(2) - 語法是用Moq註冊一個期望值。 Expect()方法只是詢問將被調用的方法 - 所以在這種情況下,使用任何參數mockEmailInstance.SendMail()。

+0

我的意思是「abc」,「123」或「623」,「bcc」。我猜字符串的類型不是最好用的字。 – Xaisoft 2009-10-07 23:36:11