鉴于以下课程:
public class TestAttribute : ActionFilterAttribute
{
public bool SomeExampleBool = false;
public override void OnActionExecuting(HttpActionContext actionContext)
{
Task.Factory.StartNew(() => { SomeExampleBool = true; });
}
}
您如何编写OnActionExecuting
的有效单元测试,其中SomeExampleBool
等于true
?
当编写单元测试并调用OnActionExecuting
,然后调用Assert时,逻辑将在尚未执行的线程上执行。所以Assert失败了。你会尝试Thread.Sleep
这样的事情几秒钟吗?看起来像一个黑客。我确信有一种更好的方式,我没有想到,但我正在向社区寻求帮助。
答案 0 :(得分:3)
您需要将Task
返回的StartNew
公开给您想要的任何人:
由于您没有向任何人公开回复Task
,您只是将其丢弃在地板上,其他任何人都无法等待,或者无法运行它完成后的继续。通常,您需要从该方法返回Task
。如果你不能,因为它是一个事件处理程序,那么你可以将Task
存储在一个字段或调用者能够访问的某种其他形式的状态中。
答案 1 :(得分:1)
Task.Factory.StartNew
将返回Task
的实例。如果您致电task.Wait()
,您将确保在执行下一行之前完成任务。您应该能够Wait
完成任务,然后在此之后运行您的断言。