相关疑难解决方法(0)

nunit如何成功等待异步void方法完成?

async/await在C#中使用时,通常的规则是避免,async void因为这几乎是火,忘记了,Task如果没有从方法发送返回值,则应该使用.说得通.但奇怪的是,在本周早些时候,我正在为async我编写的一些方法编写一些单元测试,并注意到NUnit建议将async测试标记为void或者返回Task.然后我试了一下,果然,它奏效了.这看起来很奇怪,因为nunit框架如何能够运行该方法并等待所有异步操作完成?如果它返回Task,它可以等待任务,然后做它需要做的事情,但是如果它返回void它怎么能把它拉下来呢?

所以我破解了源代码并找到了它.我可以在一个小样本中重现它,但我根本无法理解它们正在做什么.我想我对SynchronizationContext以及它是如何工作的了解不够.这是代码:

class Program
{
    static void Main(string[] args)
    {
        RunVoidAsyncAndWait();

        Console.WriteLine("Press any key to continue. . .");
        Console.ReadKey(true);
    }

    private static void RunVoidAsyncAndWait()
    {
        var previousContext = SynchronizationContext.Current;
        var currentContext = new AsyncSynchronizationContext();
        SynchronizationContext.SetSynchronizationContext(currentContext);

        try
        {
            var myClass = new MyClass();
            var method = myClass.GetType().GetMethod("AsyncMethod");
            var result = method.Invoke(myClass, null);
            currentContext.WaitForPendingOperationsToComplete();
        }
        finally
        {
            SynchronizationContext.SetSynchronizationContext(previousContext);
        }
    }
}

public class MyClass
{
    public async void …
Run Code Online (Sandbox Code Playgroud)

.net c# nunit async-await

33
推荐指数
1
解决办法
4954
查看次数

有没有办法对异步方法进行单元测试?

我在.NET平台上使用Xunit和NMock.我正在测试一个方法是异步的表示模型.该方法创建一个异步任务并执行它,以便该方法立即返回,我需要检查的状态尚未准备好.

我可以在完成时设置一个标志而不修改SUT但这意味着我必须继续检查while循环中的标志,例如,可能超时.

我有什么选择?

.net unit-testing xunit.net nmock

21
推荐指数
2
解决办法
1万
查看次数

标签 统计

.net ×2

async-await ×1

c# ×1

nmock ×1

nunit ×1

unit-testing ×1

xunit.net ×1