C#NUnit不异步运行测试

C#NUnit不异步运行测试,c#,.net,nunit,.net-4.5,C#,.net,Nunit,.net 4.5,我编写了以下测试,试图利用.NET 4.5中提供的新async/await关键字: [Test] public async void DefaultFilesValid() { LogTest(log); var libraryTasks = new List<Task<string>>(); foreach (var def in LibrariesModel.LibraryDefinitions)

我编写了以下测试,试图利用.NET 4.5中提供的新async/await关键字:

    [Test]
    public async void DefaultFilesValid()
    {
        LogTest(log);
        var libraryTasks = new List<Task<string>>();
        foreach (var def in LibrariesModel.LibraryDefinitions)
        {
            IViewModel viewModel = (IViewModel)ReflectionUtility.CreateNew(def.ModelType);
            var libraries = def.LibraryFiles.Where(f => def.IsDefaultFile(f)).ToArray();
            foreach(var library in libraries)
            {
                var libraryTask = LoadEmbeddedLibraryAsync(viewModel, library);
                libraryTasks.Add(libraryTask);
            }
        }

        // Wait for the results
        var libraryErrors = await Task.WhenAll(libraryTasks);
        var errors = libraryErrors.SelectMany(m => m);
        Assert.True(!errors.Any(), String.Join(Environment.NewLine, errors));
    }

    private async Task<string> LoadEmbeddedLibraryAsync(IViewModel viewModel, string library)
    {
        return await Task.Factory.StartNew<string>(() =>
        {
            var libraryDef = viewModel.Library;
            var libraryMessage = String.Format("The default library '{0}' of the type '{1}' ", library, libraryDef.LibraryName);
            try
            {
                // Open the library
                viewModel.Open(library, library: true);

                // Check that the hash is as expected
                var fileHash = libraryDef.GetDefaultFileHash(library);
                var hash = viewModel.Source.GetStatewiseHashCode().ToString();
                if (fileHash != hash)
                    return libraryMessage + String.Format("has been modified, model hash was '{0}' but '{1}' was expected.", hash, fileHash);
            }
            catch (Exception ex)
            {
                return String.Format("failed to open: {0}", ExceptionUtility.JoinExceptionMessages(ex));
            }
            return null;
        });
    }
[测试]
公共异步void DefaultFilesValid()
{
LogTest(log);
var libraryTasks=新列表();
foreach(LibrariesModel.LibraryDefinitions中的变量定义)
{
IViewModel viewModel=(IViewModel)ReflectionUtility.CreateNew(def.ModelType);
var libraries=def.LibraryFiles.Where(f=>def.IsDefaultFile(f)).ToArray();
foreach(库中的var库)
{
var libraryTask=LoadEmbeddedLibraryAsync(视图模型,库);
libraryTasks.Add(libraryTask);
}
}
//等待结果
var libraryErrors=等待任务.WhenAll(libraryTasks);
var errors=libraryErrors.SelectMany(m=>m);
Assert.True(!errors.Any(),String.Join(Environment.NewLine,errors));
}
专用异步任务LoadEmbeddedLibraryAsync(IViewModel viewModel,字符串库)
{
return wait Task.Factory.StartNew(()=>
{
var libraryDef=viewModel.Library;
var libraryMessage=String.Format(“类型为“{1}”的默认库“{0}”,libraryDef.LibraryName);
尝试
{
//打开图书馆
打开(库,库:true);
//检查哈希是否如预期的那样
var fileHash=libraryDef.GetDefaultFileHash(库);
var hash=viewModel.Source.GetStatewiseHashCode().ToString();
if(fileHash!=hash)
return libraryMessage+String.Format(“已修改,模型哈希为{0},但应为{1}”,hash,fileHash);
}
捕获(例外情况除外)
{
返回String.Format(“未能打开:{0}”,ExceptionUtility.JoinExceptionMessages(ex));
}
返回null;
});
}
但是代码是同步执行的,有人能解释一下我做错了什么吗

谢谢,
Alex.

将单元测试从
async void
更改为
async Task
。NUnit仅支持v2.6.2以后版本的
async void
单元测试,并且仅在v3的v2.9.6中支持它们(v3中的支持已在v2.9.7中删除)
async void
测试要求NUnit提供一个特殊的上下文,它可以更改
await
的行为(可能还有
StartNew
,尽管我还没有测试过)

作为旁注:

  • 使用
    Task.Run
    而不是
    Task.Factory.StartNew
    。我有一篇博客文章描述
  • 使用
    Task.Run
    调用方法,而不是实现(伪)异步方法。我有另一篇博客描述