Атрибут фабрики Mbunit с ExpectedException - PullRequest
1 голос
/ 01 августа 2011

Есть ли способ написать, что я ожидаю определенного исключения для определенных входных данных, когда я использую атрибут Factory?Я знаю, как это сделать с помощью атрибута Row, но он мне нужен для динамически генерируемых тестовых входных данных.

См. Ниже пример теста, в котором показана функция, которая возвращает значение обратной строки:

[TestFixture]
public class MyTestFixture()
{
   private IEnumerable<object[]> TestData
   {
      get
      {
          yield return new object[] { "MyWord", "droWyM" };
          yield return new object[] { null, null }; // Expected argument exception
          yield return new object[] { "", "" };
          yield return new object[] { "123", "321" };
      }
   }

   [Test, Factory("TestData")]
   public void MyTestMethod(string input, string expectedResult)
   {
      // Test logic here...   
   }
}

1 Ответ

0 голосов
/ 01 августа 2011

Боюсь, что нет встроенной функциональности для присоединения метаданных (например, ожидаемого исключения) к строке тестовых параметров, поступающих из фабричного метода.

Однако простое решение заключается впередать тип ожидаемого исключения в качестве регулярного параметра теста ( null , если не ожидается выдача исключения) и заключить проверенный код в метод * Assert.Throws или Assert.DoesNotThrow.

[TestFixture]
public class MyTestFixture()
{
  private IEnumerable<object[]> TestData
  {
    get
    {
        yield return new object[] { "MyWord", "droWyM", null };
        yield return new object[] { null, null, typeof(ArgumentNullException) };
        yield return new object[] { "", "", null };
        yield return new object[] { "123", "321", null };
    }
  }

  [Test, Factory("TestData")]
  public void MyTestMethod(string input, string expectedResult, Type expectedException)
  {
    RunWithPossibleExpectedException(expectedException, () => 
    {
       // Test logic here... 
    });
  }

  private void RunWithPossibleExpectedException(Type expectedException, Action action)
  {
    if (expectedException == null)
      Assert.DoesNotThrow(action);
    else
      Assert.Throws(expectedException, action);
  }
}

Кстати, может быть интересно иметь дополнительное утверждение Assert.MayThrow, чтобы избавиться от вспомогательного метода.Он может просто принять null в качестве ожидаемого типа исключения.Возможно, вы могли бы создать запрос функции здесь , или вы можете отправить патч.

...