asp.net - 奇怪的异常测试 EmailSender
问题描述
我刚刚密切关注有关在 ASP.NET Core 3.0 MVC 应用程序中搭建 Identity UI 的所有 MS 说明。如果我运行该项目,它会很好地打开默认主页,并且该页面上的链接响应良好。然而,一个简单的集成测试会因异常而失败。
中的单个方法EmailSender
如下所示:
public Task SendEmailAsync(string email, string subject, string htmlMessage)
{
using (var client = new SmtpClient())
using (var msg = new MailMessage())
{
msg.From = new MailAddress("system@timekeeper.co.za");
msg.To.Add(new MailAddress(email));
msg.Subject = subject;
msg.IsBodyHtml = true;
client.UseDefaultCredentials = false;
client.Credentials = new NetworkCredential("timekeeper@somewhere.com", "something");
client.Host = "mail.myhost.com";
client.Port = 25;
return client.SendMailAsync(msg);
}
}
我的测试看起来像这样:
[TestMethod]
public async Task Send_Email()
{
var sender = new EmailSender();
await sender.SendEmailAsync("somebody@somewhere.net", "Test Mail", "This is a test");
Assert.IsTrue(true);
}
当我运行测试时,它失败并出现以下异常:
Test method TimeKeeper.Tests.Integration.EmailSEnderTests.Send_Email threw exception:
System.Threading.Tasks.TaskCanceledException: A task was canceled.
at TimeKeeper.Tests.Integration.EmailSEnderTests.Send_Email() in D:\Dev\RestServices\TimeKeeper.Tests.Integration\EmailSEnderTests.cs:line 15
at Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.ThreadOperations.ExecuteWithAbortSafety(Action action)
解决方案
await
任务而不是返回它。
public async Task SendEmailAsync(string email, string subject, string htmlMessage) {
using (var client = new SmtpClient())
using (var msg = new MailMessage()) {
msg.From = new MailAddress("system@timekeeper.co.za");
msg.To.Add(new MailAddress(email));
msg.Subject = subject;
msg.IsBodyHtml = true;
client.UseDefaultCredentials = false;
client.Credentials = new NetworkCredential("timekeeper@somewhere.com", "something");
client.Host = "mail.myhost.com";
client.Port = 25;
await client.SendMailAsync(msg); //<-- await completion
}
}
client
很有可能在它有机会完成发送电子邮件之前就被处理掉了。
您还应该注意文档中关于使用现在已过时 SmtpClient
的新开发的警告。
DE0005: 不应使用 SmtpClient
动机
SmtpClient 不支持许多现代协议。它是仅兼容的。它非常适合来自工具的一次性电子邮件,但不能扩展到协议的现代要求。
推荐
使用 MailKit 或其他库。
推荐阅读
- pandas - 选择每第 n 行作为 Pandas DataFrame 而无需读取整个文件
- ssas - SSAS OLAP 多维数据在部署时消失
- c++ - 我想检查括号是否在正确的位置,但我的代码没有正确执行
- python - matplotlib 中的乳胶字体 - Script-r
- scheme - 如何使用命令行在 Scheme 中加载可执行文件
- r - 在R中的汇总预测表中按组加入残差
- python - 如何在 Windows 10 上更新 TensorFlow
- java - 将属性文件添加到服务器
- react-native - 第二次到达时键盘不可见
- git - 如何从共享库访问 Jenkins 中的工作区文件