如何对邮件发送功能进行单元测试

Mic*_*hel 25 c# unit-testing mocking

我有一个创建报告并将其发送给用户的功能.我所做的是为电子邮件功能创建一个模拟器,并验证是否调用了电子邮件类的"发送"功能.

所以现在我知道函数被调用了,但是如何对Send()函数的主体进行单元测试呢?如何证明主题和正文是正确的并且附件附在电子邮件中?

Bib*_*bhu 33

可以通过以下方式完成.

第1步:导航到您的Web.Config文件并向其添加以下标记.

<system.net>
    <mailSettings>
        <smtp deliveryMethod="SpecifiedPickupDirectory">
            <specifiedPickupDirectory pickupDirectoryLocation="E:\MailTest\"/>
        </smtp>
    </mailSettings>
</system.net>
Run Code Online (Sandbox Code Playgroud)

确保您为拾取位置指定的目录必须存在.

第2步:现在测试您的电子邮件发送功能.我曾经使用button_click以下代码测试此功能.

SmtpClient smtp = new SmtpClient();
MailMessage message = new MailMessage("me@gmail.com", "me@yahoo.com","My Message Subject","This is a test message");
smtp.Send(message);
Run Code Online (Sandbox Code Playgroud)

输出:它将.eml使用randonly生成的GUID名称在文件夹内创建文件,这是我们收到后可以看到的电子邮件.对我来说,它创建了一个像文件夹c127d1d5-255d-4a5a-873c-409e23002eef.eml中的E:\MailTest\文件

希望这可以帮助 :)

  • 可能是一个很好的解决方案,但**这不是一个单元测试**. (2认同)

ole*_*hri 12

在您的单元测试中,告诉您的模拟框架期望Send()使用特定正文文本进行调用.

Rhino Mocks示例:

var mockMail = MockRepository.GenerateMock<Mail>();
mockMail.Expect( m => m.Send("ExpectedFrom", "ExpectedTo", "ExpectedSubject", "ExpectedBodytext") );

mockMail.Send(...whatever...);

mockProvider.VerifyAllExpectations();
Run Code Online (Sandbox Code Playgroud)


Dan*_*orf 8

我最近自己遇到了这个问题.尝试使用http://netdumbster.codeplex.com/.此库允许您启动本地SMTP服务器并检查它收到的邮件.这一切都在内存AFAIK中处理,因此对测试的性能影响应该是最小的.

在您的测试中,您可以像这样创建服务器

SimpleSmtpServer server = SimpleSmtpServer.Start(25);
Run Code Online (Sandbox Code Playgroud)

然后只需更改邮件发件人类的配置即可使用本地smtp服务器(localhost:25).发送邮件后,您可以像这样访问它

server.ReceivedEmail[0]
Run Code Online (Sandbox Code Playgroud)

并使用Data或MessageParts属性检查主题,正文和附件.

我希望这有帮助.