C# Moq为什么模拟方法返回null和测试直到通过?

C# Moq为什么模拟方法返回null和测试直到通过?,c#,unit-testing,testing,model-view-controller,moq,C#,Unit Testing,Testing,Model View Controller,Moq,我试图模拟下面的两个接口 Mock emailSender=new Mock(); Mock emailTemplate=新建Mock(); 这是设置 emailTemplate.Setup(x=>x.GetForgotPasswordTemplate(It.IsAny()).Returns(It.IsAny()); emailSender.Setup(x=>x.SendEmailAsync(It.IsAny(),默认值)).ReturnsAsync(It.IsAny()); 下面是调用的控

我试图模拟下面的两个接口

Mock emailSender=new Mock();
Mock emailTemplate=新建Mock();
这是设置

emailTemplate.Setup(x=>x.GetForgotPasswordTemplate(It.IsAny()).Returns(It.IsAny());
emailSender.Setup(x=>x.SendEmailAsync(It.IsAny(),默认值)).ReturnsAsync(It.IsAny());
下面是调用的控制器操作

[EnableCors(PolicyName=“AllowClientAccess”)]
[HttpGet(“忘记”)]
公共异步任务ForgotPassword([FromQuery]字符串电子邮件)
{
var user=await\u userManager.findbyemailsync(电子邮件);
如果(用户!=null)
{
//找不到MOQ文件路径
EmailTemplateViewModel model=新的EmailTemplateViewModel();
model.Email=电子邮件;
model.RecipientName=user.UserName;
var message=\u emailTemplate.GetForgotPasswordTemplate(模型);
SendEmailViewModel SendEmailViewModel=新的SendEmailViewModel();
sendEmailViewModel.RecipientName=user.UserName;
sendEmailViewModel.RecipientEmail=user.Email;
sendEmailViewModel.Subject=“ForgotPassword”;
sendmailviewmodel.Body=消息;
wait_emailSender.sendmailasync(sendmailviewmodel);
返回Ok(AddSuccess(“检查电子邮件”、“忘记密码”);
}
AddModelError(“忘记密码”,“无法发送电子邮件”);
返回BadRequest(ModelErrors());
}
此行返回null

var message=\u emailTemplate.GetForgotPasswordTemplate(模型)

这是方法代码

公共字符串GetForgotPasswordTemplate(EmailTemplateViewModel模型)
{
尝试
{
var utcNow=DateTime.Now;
如果(_testEmailTemplate==null)
if(File.Exists(“Helpers/Templates/ForgotPasswordEmail.template”))
_testEmailTemplate=ReadPhysicalFile(“Helpers/Templates/ForgotPasswordEmail.template”);
var appUrl=_configuration.GetSection(“ApplicationUrl”).Value+
“/reset password?&email=“+model.email;
var emailMessage=\u testEmailTemplate
.Replace(“{user}”,model.RecipientName)
.Replace(“{testDate}”,utcNow.ToString(CultureInfo.InvariantCulture))
.Replace(“{appUrl}”,appUrl);
回复电子邮件;
}
捕获(例外e)
{
日志警告(e,“电子邮件错误”);
投掷;
}
}
此行还返回null

wait_emailSender.sendmailasync(sendmailviewmodel)

这是方法代码

公共任务SendEmailAsync(SendEmailViewModel模型,SmtpConfig config=default) { model.IsHtml=true; var from=新邮箱地址(_config.FromName,_config.FromEmail); var to=新邮箱地址(model.RecipientName,model.RecipientEmail); 返回sendmailasync(@from,new[]{to},model.Body,model.Body,config,model.IsHtml); } 这是测试

[理论]
[InlineData(”stephen@kaizenappz.com")]
当用户忘记密码AHTTPSTATUSCODE200应返回同步时的公共异步任务(字符串电子邮件)
{
var confirmUser=等待控制器。放弃密码(电子邮件);
var result=确认用户为OkObjectResult;
var实际值=(HttpStatusCode)结果?.StatusCode.Value;
var预期=HttpStatusCode.OK;
断言.AreEqual(预期、实际);
}
然而,测试通过了,我想知道的是,为什么这两个方法都返回null,为什么测试即使返回null也通过了。我怎样才能让这些东西还回去

有一件事我不明白,那就是什么时候使用它。任何时候都可以,只要传入一个普通对象和一些测试数据就可以了。如果我使用某个用户,我应该如何检查该用户是否存在。如果有,我需要将一个模型传递到控制器操作中?

设置阶段 每当您需要模拟接口方法时,请尝试在安装过程中保持许可。
换句话说,允许接收任何参数:

常量字符串mockedForgotPwdTemplate=“…”;
电子邮件模板
.Setup(template=>template.GetForgotPasswordTemplate(It.IsAny()))
.返回(mockedForgotPwdTemplate);
如果返回值取决于参数
然后使用
的重载返回
,它接受一个函数:

常量字符串mockedTemplateWithSubject=“…”;
常量字符串mockedTemplateWithoutSubject=“…”;
电子邮件模板
.Setup(template=>template.GetForgotPasswordTemplate(It.IsAny()))
.Returns((EmailTemplateViewModel vm)=>!string.IsNullOrEmpty(vm.Subject)?mockedTemplateWithSubject:mockedTemplateWithoutSubject);
验证阶段 在断言过程中,请尽量具体。
如果您有权访问该参数,则将其传递给
验证

var mockedViewTemplate=新的EmailTemplateViewModel{…};
电子邮件模板
.Verify(template=>template.GetForgotPasswordTemplate(mockedViewTemplate),Times.Once);
请记住,moq使用参考检查来确定
预期
实际
参数相同。如果没有对该参数的引用,则应使用
It.Is

const字符串expectedSubject=“ForgotPassword”;
电子邮件模板
.Verify(模板=>template.GetForgotPasswordTemplate(
It.Is(vm=>expectedSubject==vm.Subject),Times.one);
或者,如果希望对多个属性进行断言,则:

私有布尔资产视图模型(EmailTemplateViewModel actualVM,字符串expectedSubject,字符串expectedRecipientName)
{
断言。相等(预期主体、实际主体);
Assert.Equal(expectedRecipientName、actualVM.RecipientName);
返回true;
}  
//...
常量字符串expectedSubject=“ForgotPassword”,ExpectedRecippent=“…”;
电子邮件模板
.Verify(模板=>template.GetForgotPasswordTemplate(
It.Is(vm=>this.AssertViewModel(vm,expectedSubject,expectedRecipient)),次.Once);

测试在哪里?您发布的所有代码都没有