等待单元测试

时间:2015-08-26 18:50:54

标签: c# unit-testing events asynchronous

我正在尝试从单元测试中对事件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完成执行在继续进行剩下的测试之前,我不太确定该怎么做。

由于时间原因,我只需要等待Se​​ndCompleted完成处理的最短时间,这一点非常重要。

我进行了大量搜索,但似乎无法找到解决此特定问题的任何内容。

快速编辑:在所有情况下,电子邮件成功发送,只有失败的测试。

0 个答案:

没有答案