Утвердить исключение из NUnit в MS TEST - PullRequest
14 голосов
/ 21 ноября 2011

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

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

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

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

Ответы [ 3 ]

29 голосов
/ 21 ноября 2011
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);
7 голосов
/ 11 февраля 2012

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

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

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

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

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

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 голосов
/ 21 ноября 2011

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

...