有没有一种方法进行单元测试异步方法?(Is there a way to unit test an

2019-07-30 17:18发布

我使用的.NET平台的xUnit和NMock。 我测试的演示模型,其中一个方法是异步的。 该方法创建一个异步任务,因此该方法立即返回,我需要检查的状态都还没有准备好执行它。

我可以设置在终点的标志不修改SUT但是这意味着我将不得不继续检查的标志,例如一个while循环,也许超时。

我有哪些选择?

Answer 1:

请问您的目标特征任何种类的信号,该异步方法完成,如事件? 如果是这样的话,你可以用下面的办法:

[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);
}


Answer 2:

只是觉得你可能要因为#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 ...
}


Answer 3:

我的优选的方法是模拟出和注入实际穿线机构,使得被测试它不是异步。 有些时候,这是不可能的(如果该方法的线程是框架的一部分,否则不是你的控制之下)。

如果你无法控制线程的创建,然后等待线程以某种方式完成,无论是while循环或只是定时等待然而长期的线程应该采取和失败的测试,如果状态是不存在的,因为它时间太长,反正。



Answer 4:

看看我的单元测试Silverlight应用程序的文章

http://www.codeproject.com/KB/silverlight/Ag3DemoLOB.aspx

有单元测试异步调用WCF服务的方法的例子...



文章来源: Is there a way to unit test an async method?