C# 这个Moq测试主要是关于linq语法的,它是如何工作的?
我在Dimecasts.net上看了这个。在视频中,当这个家伙设置他的moq测试时,他有以下代码: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
[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”。我猜字符串的类型不是最好用的词。