C# 这个Moq测试主要是关于linq语法的,它是如何工作的?

C# 这个Moq测试主要是关于linq语法的,它是如何工作的?,c#,linq,moq,C#,Linq,Moq,我在Dimecasts.net上看了这个。在视频中,当这个家伙设置他的moq测试时,他有以下代码: [Test] public void TestWithMock() { var mockEmailService = new Mock<IEmailService>(); mockEmailService.Expect(x => x.SendEmail(It.IsAny<string>,It.IsAny<string>)).R

我在Dimecasts.net上看了这个。在视频中,当这个家伙设置他的moq测试时,他有以下代码:

[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();
}
[测试]
公共void TestWithMock()
{
var mockEmailService=new Mock();
mockEmailService.Expect(x=>
x、 sendmail(It.IsAny,It.IsAny)).Returns(true);
var emailer=新的emailer(mockEmailService.Object);
emailer.SendBatchEmails();
}
以下是我的问题:

1) moq是否循环测试SendBatchEmails方法的所有不同类型的字符串? 我想我对嘲弄的工作原理有点困惑

2) 有人能解释一下Expect部分的lambda语法吗

3) 作者最初在SendEmail函数中使用了“”,但失败了,因此他改为使用“”
It.IsAny
,但我仍然不清楚为什么它在使用“”时失败


Stackoverflow没有将字符串关键字放在尖括号中。(已修复)

它不会在任何字符串中循环,设置的期望值只会与调用SendEmail时给出的任何字符串匹配,并返回真实结果。期望中的lambda在设置期望的对象上设置函数调用匹配,在本例中为mockEmailService。这里的变量x表示作为期望对象的对象的值。它将在该对象上匹配的方法是SendEmail,而且当使用任何字符串参数调用SendEmail时,它将匹配。当预期调用发生时,它将返回值true

最初失败的原因可能是调用SendEmail时使用了一对与“”不匹配的参数。这意味着期望没有得到满足,因此它没有返回到真实的状态。未达到预期的事实可能使测试失败,但也可能是SendBatchEmail在方法返回false时失败了。

1)不同类型的字符串是什么意思?只有一种类型的字符串。。。这是字符串

mocking所做的是自动创建一个新的对象类型来实现提供的接口或抽象类。在本例中,Moq将生成一个新的类类型,其名称类似于“IEmailService”\u a324bc54ff123827d。此类型将实现IEmailService接口的所有方法以返回null

3) 我会在(2)之前先回答这个问题。“”失败的原因是,它将注册对mockEmailService.SendMail(“,”)的预期调用。如果使用任何其他参数调用它,则预期将失败。使用IsAny()意味着您不关心参数值,只希望发生方法调用

最后,(2)-语法记录了对Moq的期望。Expect()方法只要求调用将被调用的方法,因此在本例中,使用任何参数调用mockEmailInstance.SendMail()

1)最低起订量不会影响
SendBatchEmails
的工作方式,因为您不是在嘲笑
Emailer
类。相反,您模拟的是
IEmailService
接口,因此如果
Emailer
类调用
IEmailService
对象上的方法,Moq将捕获这些调用

2) 您正在告诉Moq您希望调用
IEmailService
上的
sendmail
方法。您还告诉Moq,当调用
sendmail
时,您希望Moq自动返回
true

由于Moq对象被传递到
Emailer
类中,因此此测试将测试
SendBatchEmails
中的代码是否调用
sendmail
方法


3) 只有当参数匹配时,期望才会实现。如果您告诉Moq您希望使用
调用
sendmail
,“
作为参数,并且使用不同的字符串调用
sendmail
,则会失败
It.IsAny()。还要注意的是,这并不是真正的测试任何东西-没有断言,也没有可验证的期望,也没有调用mockEmailService.Verify()。(我通常做状态测试,但行为测试可能在这里得到保证。)我的意思是“abc”、“123”或“623”、“bcc”。我猜字符串的类型不是最好用的词。