2013-08-14 3 views
11

Я пытаюсь проверить метод async, создавая конкретное исключение.FluentAssertions ShouldNotTrow не распознается для метода async/Func

Для этого я использую MSTEST и FluentAssertions 2.0.1.

Я проверил это Discussion on Codeplex и посмотреть, как он работает с методами асинхронному исключения это еще одна ссылка о FluentAssertions async tests:

Через некоторое время пытался работать с моим «производства» кода я выключенным на Fluentassertions фальшивый класс aync и мой результирующий код, как это (поместить этот код внутри [TestClass]:

[TestMethod] 
public void TestThrowFromAsyncMethod() 
{ 
    var asyncObject = new AsyncClass(); 
    Action action =() => 
    { 
     Func<Task> asyncFunction = async() => 
     { 
      await asyncObject.ThrowAsync<ArgumentException>(); 
     }; 
     asyncFunction.ShouldNotThrow(); 
    }; 
} 


internal class AsyncClass 
{ 
    public async Task ThrowAsync<TException>() 
     where TException : Exception, new() 
    { 
     await Task.Factory.StartNew(() => 
     { 
      throw new TException(); 
     }); 
    } 

    public async Task SucceedAsync() 
    { 
     await Task.FromResult(0); 
    } 
} 

проблема заключается в том, что ShouldNotThrow не действует:

ShouldNotThrow method is not recognised by the code. If I try to compile, it gives me this error: 'System.Func' does not contain a definition for 'ShouldNotThrow' and the best extension method overload 'FluentAssertions.AssertionExtensions.ShouldNotThrow(System.Action, string, params object[])' has some invalid arguments

Спасибо.


РЕШЕНИЕ

2.0.1 FA версия не поддерживает эту ShouldNotThrow функциональности и она будет включена в следующей версии 2.1 (около следующей недели).

Примечание: ShouldThrow уже поддерживается в версии 2.0.1.

+1

Я ничего не знаю о FluentAssertions, но исключение говорит, что ShouldNotThrow определяется только для 'Action', а не' Func'. –

+1

@KeithPayne Это означает, что FluentAsseritions, вероятно, не поддерживает 'async'. – svick

+0

FluentAssertions поддерживает async, если вы читаете ссылку выше (ссылка), вы можете ее увидеть. И это тоже могло бы помочь: http://fluentassertions.codeplex.com/workitem/12148 – ferpega

ответ

15

Вам не нужен охватывающее действие. Это используется только в модульных тестах, чтобы убедиться, что API выбрасывает правильное исключение. Этого должно быть достаточно:

[TestMethod] 
public void TestThrowFromAsyncMethod() 
{ 
    Func<Task> asyncFunction = async() => 
    { 
     await asyncObject.ThrowAsync<ArgumentException>(); 
    }; 

    asyncFunction.ShouldNotThrow(); 
} 

К сожалению ShoudlNotThrow() на Func отсутствует .NET 4.5. Я исправил это в версии 2.1 (в настоящее время это собака).

+0

При размещении кода выделите его и нажмите кнопку '{}' (или вручную отложите каждую строку на четыре пробела, если вам нужно упражнение). –

+0

@DennisDoomen Я знаю, я писал только точный код, который проходит тесты в FA. Но если мои рамки уже равны 4.5, почему FA устанавливает 4.0 .... с nuget? – ferpega

+0

@DennisDoomen Я имею в виду, что FA - это версия Runtime '4.0.30319', и она уже находится в папке' net45' с полным путем: '.... \ packages \ FluentAssertions.2.0.1 \ lib \ net45 \ FluentAssertions. dll'. Но нет «ShouldNotThrow». – ferpega

1

Если вы посмотрите на AssertionExtensions.cs class, вы увидите, что метод расширения ShouldNotThrow для Func определен только для целей компиляции net45 или winrt.

Проверьте это:

  1. Ваш проект модульных тестов на .net 4.5 или WinRT
  2. ссылаются, библиотека утверждение является .net 4.5 один, если не попытаться изменить библиотеку ссылочные FluentAssertions вправо один.

Кроме того, после делать это, я думаю, вам нужно вызвать метод действия, чтобы сделать утверждение, иначе внутренняя лямбда не будет называться:

[TestMethod] 
public void TestThrowFromAsyncMethod() 
{ 
    var asyncObject = new AsyncClass(); 
    Action action =() => 
    { 
     Func<Task> asyncFunction = async() => 
     { 
      await asyncObject.ThrowAsync<ArgumentException>(); 
     }; 
     asyncFunction.ShouldNotThrow(); 
    }; 

    action.ShouldNotThrow(); 
} 
+0

Цель - 4.5, но версия выполнения: v4.0.30319.FluentAssertions управляется Nuget. – ferpega

+0

Проверьте, что ссылка на библиотеку FluentAssertions поступает из правой папки с именем net45 внутри папки пакета nuget. –

+0

В скором выпуске FA 2.1 эти методы расширения будут поддерживаться для .NET 4.0 –