2014-10-23 4 views
0

я написал следующий тест пытается использовать новый асинхронном/ждут ключевых слов, доступных в .NET 4.5:C# NUnit не работает тесты асинхронно

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

Однако код выполняется синхронно, может кто-то пожалуйста, объясните что я делаю неправильно?

Thanks, Alex.

ответ

2

Измените ваш модульный тест с async void по номеру async Task. NUnit поддерживает async void модульные тесты только с v2.6.2 вперед для v2 и поддерживает только их в v2.9.6 для v3 (поддержка в v3 уже удалена в версии 2.9.7). async void требуют NUnit для предоставления специального контекста, который изменяет поведение await (и, возможно, StartNew, хотя я не тестировал это).

В качестве примечания:

  • Использование Task.Run вместо Task.Factory.StartNew. У меня есть сообщение в блоге, описывающее why.
  • Использование Task.Run по звонок методы, а не реализация (поддельные-) асинхронные методы. У меня есть еще одна запись в блоге, описывающая why.
Смежные вопросы