【问题标题】:C# NUnit not running tests asynchronouslyC# NUnit 没有异步运行测试
【发布时间】:2014-10-23 20:29:10
【问题描述】:

我编写了以下测试,试图利用 .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;
        });
    }

但是代码是同步执行的,有人可以解释一下我做错了什么吗?

谢谢, 亚历克斯。

【问题讨论】:

    标签: c# .net nunit .net-4.5


    【解决方案1】:

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

    附注:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-24
      • 2014-01-03
      • 1970-01-01
      • 2011-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-16
      相关资源
      最近更新 更多