我真的感觉不好。单元测试,发送电子邮件,并创建一个新的线程
我有一个Web应用程序发送电子邮件通知。
这是一个包含发送电子邮件这样的基本方法的类:
MailMessage email = new MailMessage();
email.To.Add("[email protected]");
email.Subject = "Test";
email.Body = "t";
SmtpClient client = new SmtpClient();
client.Send(email);
但我有一个名为NotificatorService该服务验证一些逻辑,因为这仅仅是一个“额外”的方法这项服务被称为一个新的线程..我做的是这样的:
public void NotifyMembers(NotificatorClientDTO clientDto) {
if(clientDto == null)
throw new ArgumentNullException("clientDto");
Thread t = new Thread(
() => {
// go to database, verify business rules, etc...
// At the end if it is ok, invoke the method that sends a email
}
t.Start()
}
如果我创建一个单元测试,实例化NotificatorService并调用无tifyMembers与一些数据,代码将抛出一个异常,但只有当我在一个分离的线程执行。
我创建的线程设置在foregronnd,所以系统不会销毁我想要的过程。
异常消息是这样的:
SmtpException:无法评估表达式,因为代码被优化或天然帧是在调用堆栈的顶部
我走至2点内的异常,我看到这
_message“线程正在中止。”字符串
为什么会发生这种情况? 是什么导致线程中止?
这是测试包括任何UI层组件的调用?有时它值得在测试程序集配置中指定MTA公寓状态 – sll
服务创建一个新线程,因为我不想阻塞主线程。这个线程(创建deamon的线程)将继续,并返回到将呈现视图以显示给客户端的MVC应用程序。 – anotherNeo
因此,我认为是UI级别,您是否尝试使用我提供的代码段来更改AppartmentState for NUNit线程? – sll