我使用的.NET平台的xUnit和NMock。 我测试的演示模型,其中一个方法是异步的。 该方法创建一个异步任务,因此该方法立即返回,我需要检查的状态都还没有准备好执行它。
我可以设置在终点的标志不修改SUT但是这意味着我将不得不继续检查的标志,例如一个while循环,也许超时。
我有哪些选择?
我使用的.NET平台的xUnit和NMock。 我测试的演示模型,其中一个方法是异步的。 该方法创建一个异步任务,因此该方法立即返回,我需要检查的状态都还没有准备好执行它。
我可以设置在终点的标志不修改SUT但是这意味着我将不得不继续检查的标志,例如一个while循环,也许超时。
我有哪些选择?
请问您的目标特征任何种类的信号,该异步方法完成,如事件? 如果是这样的话,你可以用下面的办法:
[Test]
public void CanTestAsync()
{
MyObject instance = new MyObject()
AutoResetEvent waitHandle = new AutoResetEvent(false);
// create and attach event handler for the "Finished" event
EventHandler eventHandler = delegate(object sender, EventArgs e)
{
waitHandle.Set(); // signal that the finished event was raised
}
instance.AsyncMethodFinished += eventHandler;
// call the async method
instance.CallAsyncMethod();
// Wait until the event handler is invoked
if (!waitHandle.WaitOne(5000, false))
{
Assert.Fail("Test timed out.");
}
instance.AsyncMethodFinished -= eventHandler;
Assert.AreEqual("expected", instance.ValueToCheck);
}
只是觉得你可能要因为#1回答这一更新实际上推荐的旧模式来解决这个问题。
在.NET 4.5 + 1.9的xUnit或更高,你可以简单地返回一个任务,还可以使用async关键字从测试到有xUnit的等待测试异步完成。
看到这篇文章的xUnit.net 1.9
[Fact]
public async Task MyAsyncUnitTest()
{
// ... setup code here ...
var result = await CallMyAsyncApi(...);
// ... assertions here ...
}
我的优选的方法是模拟出和注入实际穿线机构,使得被测试它不是异步。 有些时候,这是不可能的(如果该方法的线程是框架的一部分,否则不是你的控制之下)。
如果你无法控制线程的创建,然后等待线程以某种方式完成,无论是while循环或只是定时等待然而长期的线程应该采取和失败的测试,如果状态是不存在的,因为它时间太长,反正。
看看我的单元测试Silverlight应用程序的文章
http://www.codeproject.com/KB/silverlight/Ag3DemoLOB.aspx
有单元测试异步调用WCF服务的方法的例子...