我有一个方法,它在内部调用同一类的公共方法,不知怎么的,我无法测试该方法,当我试图模拟类的公用方法时,它会抛出一个错误。经过一些研究,我发现我无法设置(使用moq(该方法。
以下是的编码方法
public class FaxAsEmailBL : FaxEmailBL
{
private IEmailSender _emailSender;
private ILogger _log;
public FaxAsEmailBL(IEmailSender emailSender, ILogger log)
{
_emailSender = emailSender;
_log = log;
}
// This method is a part of interface
public bool SendFaxAsEmail(FaxMailDTO faxMailDTO)
{
bool isEmailSuccessfully = false;
// performs some validation, it is fine this method is called.
bool validationCompleted = CompleteValidation(faxMailDTO);
if (validationCompleted)
{
// performs some logic
faxMailDTO.FromEmailAddress = AppSettingsHelper.FromEmailAddress;
// this method returns bool I don't want this method to be actually called,
// neither i can make it virtual or part of interface
isEmailSuccessfully =
SendEmail(AppSettingsHelper.FaxSMTPServer, faxMailDTO);
if (isEmailSuccessfully)
{
}
}
return isEmailSuccessfully;
}
}
下面是我的测试代码
[Theory]
[MemberData(nameof(GetFaxAsMailDTO))]
public void SendFaxAsEmailTest_ReturnsTrue(FaxMailDTO faxMailDTO)
{
string sMTPServerUrl = AppSettingsHelper.RightFaxSMTPServer;
// this line throws an error System.NotSupportedException:
// “Unsupported expression: x => x non overridable members"
_mockNPIFaxAsEmailBL.Setup(x =>
x.SendEmail(It.IsAny<string>(), It.IsAny<FaxMailDTO>()));
var result = _nPIFaxAsEmailBL.SendFaxAsEmail(faxMailDTO);
Assert.True(result);
}
有什么不同的方法来测试这种方法吗谢谢
您不能模拟作为要测试的类的一部分的方法。
一种选择是将类拆分为不同的部分,因此SendEmail
方法是作为依赖项注入的接口的一部分。
请记住,处理IO的方法很难进行单元测试。你也许可以设置一个接收电子邮件的电子邮件服务器,并以某种方式向单元测试发出它已经收到电子邮件的信号。但这将是一项相当多的工作,可能不值得付出这些努力。因此,在许多情况下,最好尽可能地将发送电子邮件等方法分开,并尽量减少它们所包含的逻辑量。因此,您可以有效地测试其他所有内容。