2013-04-10 6 views
1

Я использую xUnit и FluentAssertions для написания модульных тестов, и я застрял в следующей проблеме. Поскольку я еще не реализовал catchGetCountriesAsync) WebException, я бросаю новый NotImplementedException в этом месте.Поиск лучшей реализации этого модульного теста

Этот код является единственным способом, которым я сделал тест, фактически работает должным образом. Я добавил собственную реализацию xUnit, поскольку FluentAssertions - это просто синтаксический сахар.

[Fact] 
public async Task GetCountriesAsyncThrowsExceptionWithoutInternetConnection() 
{ 
    // Arrange 
    Helpers.Disconnect(); // simulates network disconnect 
    var provider = new CountryProvider(); 

    try 
    { 
     // Act 
     var countries = await provider.GetCountriesAsync(); 
    } 
    catch (Exception e) 
    { 
     // Assert FluentAssertions 
     e.Should().BeOfType<NotImplementedException>(); 

     // Assert XUnit 
     Assert.IsType<NotImplementedException>(e); 
    } 
} 

Хотя я нашел эту реализацию намного приятнее, она просто не работает.

[Fact] 
public async Task GetCountriesAsyncThrowsExceptionWithoutInternetConnection3() 
{ 
    // Arrange 
    Helpers.Disconnect(); // simulates network disconnect 
    var provider = new CountryProvider(); 

    // Act/Assert FluentAssertions 
    provider.Invoking(async p => await p.GetCountriesAsync()) 
      .ShouldThrow<NotImplementedException>(); 

    // Act/Assert XUnit 
    Assert.Throws<NotImplementedException>(async() => await provider.GetCountriesAsync()); 
} 

Как VS2012/ReSharper уже предлагает удалить избыточное async ключевое слово методы испытаний, я заменил async Task с void и тестом по-прежнему ведет себя то же, так что я подозреваю, что асинхр Action s не может быть ожидал, они довольно уволены и забыты.

Есть ли способ реализовать это правильно с помощью xUnit/FluentAssertions? Я думаю, что мне нужно пойти с моей первой реализацией, поскольку я не вижу никакой функциональности, такой как InvokingAsync().

+0

Возможный дубликат [Как обрабатывать исключения, заданные задачами в Asset.Unit .net.Throws ?] (Http://stackoverflow.com/questions/14084923/how-to-handle-exceptions-thrown-by-tasks -in-xunit-nets-assert-throwst) –

+0

Очень приятно, именно то, что я искал. Благодаря! –

ответ

1

На самом деле, FA 2.0 имеет специальную поддержку для обработки асинхронных исключений. Просто посмотрите на модульные тесты в AsyncFunctionExceptionAssertionSpecs. для различных примеров.

0

Что касается FluentAssertions, я добавил следующее к моему коду:

using System; 
using System.Threading.Tasks; 

namespace FluentAssertions 
{ 
    public static class FluentInvocationAssertionExtensions 
    { 
     public static Func<Task> Awaiting<T>(this T subject, Func<T, Task> action) 
     { 
      return() => action(subject); 
     } 
    } 
} 

и теперь вы можете сделать:

_testee.Awaiting(async x => await x.Wait<Foo>(TimeSpan.Zero)) 
     .ShouldThrow<BarException>(); 

, тогда как _teste.Wait<T> Возвращает Task<T>. Именование метода Awaiting имеет смысл, поскольку чистое обращение к методу не приведет к тому, что исключение будет зависеть от вызывающего, вам нужно использовать его для этого.

 Смежные вопросы

  • Нет связанных вопросов^_^