Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Moq查看是否使用值调用了方法_C#_Visual Studio_Unit Testing_Moq - Fatal编程技术网

C# 使用Moq查看是否使用值调用了方法

C# 使用Moq查看是否使用值调用了方法,c#,visual-studio,unit-testing,moq,C#,Visual Studio,Unit Testing,Moq,使用Microsoft Visual Studio 2017的内置测试和Moq 我有一个简单的类,它创建一些内容,然后将内容发送到通知系统。我需要测试通知系统是否被调用,但调用是否包含一些文本 public void DoStuff() var tenantSettings = _tenantService.GetTenantSettings(); tenantSettings.Body = "xxx SOME VALUE xxx";

使用Microsoft Visual Studio 2017的内置测试和Moq

我有一个简单的类,它创建一些内容,然后将内容发送到通知系统。我需要测试通知系统是否被调用,但调用是否包含一些文本

 public void DoStuff()
            var tenantSettings = _tenantService.GetTenantSettings();
            tenantSettings.Body = "xxx SOME VALUE xxx";
            MyService.SendMail(tenantSettings.Body);
如何测试SendMail是否包含文本“SOME VALUE”

我有一个模拟设置:

 MyServiceMock.Setup(x=>x.SendMail(It.IsAny<string>);
MyServiceMock.Setup(x=>x.SendMail(It.IsAny);

您只需在模拟上使用
验证方法即可:

MyServiceMock.Verify(x => x.SendMail("SOME VALUE"), Times.Once());
编辑:

如果要验证作为参数传递的文本是否不完全匹配,而只是包含测试值,可以使用,如下所述:

MyServiceMock.Verify(x=>x.SendMail(It.Is(s=>s.Contains(“某些值”)),Times.Once();

您需要使用
Verify
函数allon和
It.Is(Func)
函数来搜索子字符串

MyServiceMock.Verify(x => x.SendMail(It.Is<string>(s => s.Contains("SOME VALUE")), Times.Once());
MyServiceMock.Verify(x=>x.SendMail(It.Is(s=>s.Contains(“某些值”)),Times.Once();

在调用了
DoStuff()
之后,您将这一行放在测试函数的末尾。

注意,如果传入的字符串是
“xxx SOME value xxx”
,则这只匹配确切的值
“SOME value”
,而该字符串与此代码不匹配。没错,我没有看到编辑,原始问题不同
MyServiceMock.Verify(x => x.SendMail(It.Is<string>(s => s.Contains("SOME VALUE")), Times.Once());