什么开源模拟框架将允许模拟SmtpClient

时间:2014-07-26 12:51:32

标签: .net unit-testing mocking

手动测试了我以前的所有代码后,我试图获得使用单元测试框架的一些经验。基于一些初步研究,我使用的是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对象。

1 个答案:

答案 0 :(得分:0)

我建议该工具是否有限制使用它。 I.eJustMock除非你愿意为此付出代价

你认为这个场景非常简单,所以你有几个选择

将SmtpClient方法包装在界面中并公开它们以便

一个。使用穷人嘲笑/手写的手工嘲笑。

即 ISmtpClientService.SendEmail(...)

您可以创建可测试的SmtpClient服务,该服务实现ISmtpClientService。这项服务的REAL实现是真正的SmtpClient

的包装

或尝试从真正的SmtpClient继承 - 不确定这是否可能我已经密封,如果不是你可以创建一个可测试的版本,而不必像上面那样包装接口

B中。 Just Mock可能能够存根这些虚拟方法。很确定他们确实允许客户端像其他免费框架一样存根虚拟方法