我正在尝试从单元测试中对事件SmtpClient.SendCompleted进行单元测试,并且我遇到了一个烦人的问题,测试在事件实际触发之前继续处理,终止应用程序而没有实际到达事件。所以,想象下面的代码:
[TestClass]
public class emailTest
{
public bool sentEmail = false;
[TestMethod]
public void sendEmail()
{
SmtpClient smtp = new SmtpClient("smtpserver");
smtp.SendCompleted += delegate(Object sender, System.ComponentModel.AsyncCompletedEventArgs e) { sentEmail = true; };
MailMessage mm = new MailMessage("from@address.com", "to@address.com", "test subject", "test body");
smtp.SendAsync(mm, "test");
Assert.IsTrue(sentEmail);
}
}
但是,如果我手动插入这样的延迟,则此测试失败...
[TestClass]
public class emailTest
{
public bool sentEmail = false;
[TestMethod]
public void sendEmail()
{
SmtpClient smtp = new SmtpClient("smtpserver");
smtp.SendCompleted += delegate(Object sender, System.ComponentModel.AsyncCompletedEventArgs e) { sentEmail = true; };
MailMessage mm = new MailMessage("from@address.com", "to@address.com", "test subject", "test body");
smtp.SendAsync(mm, "test");
System.Threading.Thread.Sleep(50000); // Manual Delay
Assert.IsTrue(sentEmail);
}
}
然后测试通过。
让方法等待smtp.SendAsync包装它作为一项任务似乎并没有实际工作,因为我实际上并没有等待SendAsync,我试图等待SendCompleted完成执行在继续进行剩下的测试之前,我不太确定该怎么做。
由于时间原因,我只需要等待SendCompleted完成处理的最短时间,这一点非常重要。
我进行了大量搜索,但似乎无法找到解决此特定问题的任何内容。
快速编辑:在所有情况下,电子邮件成功发送,只有失败的测试。