在手动测试了我之前的所有代码之后,我试图获得一些使用单元测试框架的经验。在一些初步研究的基础上,我正在使用微软测试和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);
}这导致了一个异常,我意识到这种模拟.Net方法在开源产品(JustMock Lite)中不受支持。
那么,是否有一种方法可以使用开源的模拟框架来绕过这样的场景,或者说这对一个人来说太过了。
注意:我已经通过option of wrapping the SmtpClient编写了一个包装器,并提取了相应的接口。但是,我只是好奇地想知道我们在不包装SmtpClient对象的情况下工作的其他方法。
发布于 2014-07-27 22:33:27
我建议,如果工具有限制,不要使用它。如果你不愿意付钱的话,就用I.eJustMock
你的情况很琐碎,我想你有几个选择
将SmtpClient方法包装在接口中,并公开它们,这样您就可以
使用可怜的人嘲弄/手写的手工模拟。
ISmtpClientService.SendEmail(.)
您可以创建可测试的SmtpClient服务,它实现了ISmtpClientService。此服务的真正实现是对真实SmtpClient的包装。
或者尝试从真实的SmtpClient继承-不确定这是可能的,如果不是,您可以创建一个可测试的版本,而不必像上面那样包装在接口中
仅仅是Mock就可以对这些虚拟方法进行存根。非常确定的是,它们确实允许客户端像其他免费框架一样对虚拟方法进行存根。
https://stackoverflow.com/questions/24971198
复制相似问题