Исключение для исключения из NUnit в MS TEST

У меня есть несколько тестов, где я проверяю имя параметра в исключении. Как написать это в MS TEST?

ArgumentNullException exception = 
              Assert.Throws<ArgumentNullException>(
                            () => new NHibernateLawbaseCaseDataLoader( 
                                               null, 
                                               _mockExRepository,
                                               _mockBenRepository));

Assert.AreEqual("lawbaseFixedContactRepository", exception.ParamName);

Я надеялся на более аккуратный способ, поэтому я могу избежать использования блока try catch в тестах.

Ответы

Ответ 1

public static class ExceptionAssert
{
  public static T Throws<T>(Action action) where T : Exception
  {
    try
    {
      action();
    }
    catch (T ex)
    {
      return ex;
    }

    Assert.Fail("Expected exception of type {0}.", typeof(T));

    return null;
  }
}

Вы можете использовать метод расширения выше в качестве тестового помощника. Вот пример того, как его использовать:

// test method
var exception = ExceptionAssert.Throws<ArgumentNullException>(
              () => organizations.GetOrganization());
Assert.AreEqual("lawbaseFixedContactRepository", exception.ParamName);

Ответ 2

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

Вы можете загрузить пакет из Nuget, используя: PM > Install-Package MSTestExtensions

Или вы можете увидеть полный исходный код здесь: https://github.com/bbraithwaite/MSTestExtensions

Инструкции высокого уровня, загрузите сборку и наследуйте от BaseTest, и вы можете использовать синтаксис Assert.Throws().

Основной метод реализации Throw выглядит следующим образом:

public static void Throws<T>(Action task, string expectedMessage, ExceptionMessageCompareOptions options) where T : Exception
{
    try
    {
        task();
    }
    catch (Exception ex)
    {
        AssertExceptionType<T>(ex);
        AssertExceptionMessage(ex, expectedMessage, options);
        return;
    }

    if (typeof(T).Equals(new Exception().GetType()))
    {
        Assert.Fail("Expected exception but no exception was thrown.");
    }
    else
    {
        Assert.Fail(string.Format("Expected exception of type {0} but no exception was thrown.", typeof(T)));
    }
}

Подробнее здесь.

Ответ 3

Поскольку атрибут MSTest [ExpectedException] не проверяет текст в сообщении, лучше всего попробовать... уловить и установить Assert в свойстве Message/ParamName исключения.