手动测试了我以前的所有代码后,我试图获得使用单元测试框架的一些经验。基于一些初步研究,我使用的是Microsoft Tests和justMock Lite。但是,然后我遇到了一个相当简单的场景(从用户的角度来看),由于仅使用开源版本限制,我无法处理。以下是用于发送邮件的方案。
IEmailService 界面
public interface IEmailService {
bool SendEmail(string recipient, string message, string from);
}
WebMailService 实施
public class WebEmailService : IEmailService {
public bool SendEmail(string recipient, string message, string from) {
try {
MailMessage mail = new MailMessage(from, recipient,"",message);
SmtpClient client = new SmtpClient();
client.Send(mail);//This call needs to be mocked
return true;
}
catch (Exception) {
return false;
}
}
}
所以我试图使用JustMock Lite测试上面的内容,如下所示
单元测试
[TestMethod]
public void SendMail_WhenNoExceptionThrown_ReturnsTrue() {
IEmailService mailService = new WebEmailService();
var smtpClient = Mock.Create<SmtpClient>();
Mock.Arrange(() => smtpClient.Send(Arg.IsAny<MailMessage>())).DoNothing().MustBeCalled();
bool returnCode = mailService.SendEmail("recipient", "message", "from");
Assert.AreEqual(true, returnCode);
}
这导致异常,我意识到开源产品(JustMock Lite)不支持这种模拟.Net方法。
那么,有没有办法使用开源模拟框架来解决这些场景,或者它是否过于讨论。
注意:我已经通过option of wrapping the SmtpClient进入了包装器,并提取了相同的接口。但是,我很想知道我们工作的其他方法,而不包装SmtpClient对象。
答案 0 :(得分:0)
我建议该工具是否有限制使用它。 I.eJustMock除非你愿意为此付出代价
你认为这个场景非常简单,所以你有几个选择
将SmtpClient方法包装在界面中并公开它们以便
一个。使用穷人嘲笑/手写的手工嘲笑。
即 ISmtpClientService.SendEmail(...)
您可以创建可测试的SmtpClient服务,该服务实现ISmtpClientService。这项服务的REAL实现是真正的SmtpClient
的包装或尝试从真正的SmtpClient继承 - 不确定这是否可能我已经密封,如果不是你可以创建一个可测试的版本,而不必像上面那样包装接口
B中。 Just Mock可能能够存根这些虚拟方法。很确定他们确实允许客户端像其他免费框架一样存根虚拟方法