我在Dimecasts.net上观看了此Introduction to Moq video。在视频中,当这个家伙设置起订量测试时,他具有以下代码:
[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)moq会循环遍历所有不同类型的字符串来测试SendBatchEmails方法吗?
我想我对模拟的工作方式有些困惑。
2)有人可以解释Expect部分的lambda语法吗?
3)作者在SendEmail函数中首先使用“”,“”,但是失败了,因此他改为
It.IsAny<string>
,但是我仍然不清楚为什么它失败并显示“”,””。Stackoverflow并未将string关键字放在尖括号中。 (固定)
最佳答案
1)Moq不会影响SendBatchEmails
的工作方式,因为您没有嘲笑Emailer
类。取而代之的是模拟IEmailService
接口,因此,如果Emailer
类调用IEmailService
对象上的方法,则Moq将捕获这些调用。
2)您告诉Moq您期望在SendEmail
上调用IEmailService
方法。您还告诉Moq,当调用SendEmail
时,您希望Moq自动返回true
。
由于Moq对象被传递到Emailer
类中,因此该测试将测试SendBatchEmails
中的代码是否调用SendEmail
方法。
3)仅在参数匹配的情况下才能实现期望。如果您告诉Moq您希望以SendEmail
作为参数调用"", ""
,并且以不同的字符串调用SendEmail
,则它将失败。 It.IsAny<string>()
告诉Moq将期望与任何字符串匹配作为参数。
关于c# - 此Moq测试主要针对linq语法如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1534394/