Утверждения исключений и отладка вашего проекта C # в VS

StackOverflow https://stackoverflow.com/questions/2087045

Вопрос

Мы уже некоторое время используем NUnit и VisualStudio для написания кода на C # .NET.Тестирование исключений было выполнено в стиле

старый синтаксис:

[Test]
[ExpectException(typeof(ExceptionType))] 
public void TestExceptionType()
{

}

Теперь NUnit выпустила версию 2.5.2, которая представила Assert.Throws( Type expectedExceptionType, TestDelegate code ); Это делает тестирование исключений намного более гибким.Наши тесты на исключение теперь выглядят следующим образом:

новый синтаксис:

[Test]
public void TestWithNullBufferArgument()
{
   ArgumentNullException ex = Assert.Throws<ArgumentNullException>(() => _testInstance.TestFunction(null));

   // now you can examine the exception and it's properties
   Assert.AreEqual(ex.Message, "Argument was null");
}

Наша проблема в том, что если используется Assert.Throws, Visual Studio выдаст окно, показывающее необработанное исключение, когда NUnit (либо консоль, либо GUI runner) используется для отладки программы.

чтобы прояснить это: мы настроили проект VS, содержащий модульные тесты, на запуск nunit-x86.exe при отладке.(Смотрите Свойства проекта, вкладка "Отладка", начальное действие настроено на выполнение nunit-x86.exe)

Это останавливает NUnit от продолжения тестов.Можно продолжить отладку / модульное тестирование, нажав клавишу F5, но это нежизнеспособное решение.

Есть ли какой-нибудь способ избежать этого?Установка блока try ... catch вокруг Assert.Throws ничего не делает, поскольку исключение происходит в коде делегата.

Я надеюсь, что кто-нибудь сможет пролить некоторый свет на это.

Это было полезно?

Решение

Сама проблема возникает из-за того, что, скорее всего, у вас включена опция Включить только мой код (Tools->Options->Debugging->General-> Включить только мой код).

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

Обычно у вас есть релизная версия nunit.framework.dll, которая не имеет соответствующего файла nunit.framework.pdb.

Итак, есть 2 варианта:

  1. Отключите функцию "Только мой код"

  2. Загрузить исходные тексты nunit (с http://www.nunit.org/index.php?p=download), создайте их в режиме отладки, поместите весь nunit.framework.* (dll, pdb, xml) в библиотеку lib или другой каталог в вашем решении и ссылайтесь на этот nunit.framework.dll в вашем тестовом проекте.

Надеюсь, это поможет.

Другие советы

Та же проблема также раздражала меня в течение довольно долгого времени, я провел несколько тестов и обнаружил следующее:

Если библиотека (в данном случае nunit) скомпилирована с отладочной информацией, установленной в 'none', то если конструкция, подобная приведенной ниже, выполняется внутри библиотеки, а код делегата выдает исключение, то VS перестает жаловаться на исключение, не обработанное пользовательским кодом.

Библиотечный код:

public static Exception Throws(TestDelegate code, string message)
{
    Exception caughtException = null;

    try
    {
        code();
    }
    catch (Exception ex)
    {
        caughtException = ex;
    }        

    return caughtException;
}

Клиентский код:

private void btnTest_Click(object sender, EventArgs e)
{
  var ex = MyAssert.Throws(() => { throw new Exception(); }, "");    
}

Установка отладочной информации библиотечного проекта в любой другой параметр, отличный от "none", устраняет проблему, т. е.отладчик больше не останавливается на таких "необработанных" исключениях.Я протестировал это с помощью nunit и моей собственной библиотеки ручной сборки с приведенным выше кодом (взял фрагмент из метода Throws nunit).Я полагаю, что это особенность или "feature" VS.

Это оставляет нам не так уж много вариантов:

  1. Отфильтруйте исключение, как предлагалось ранее

  2. Перекомпилируйте nunit.framework.dll для локального использования, чтобы избежать этих раздражающих остановок

Другими вариантами могут быть контакты либо с командами MS, либо с командами NUnit, либо с обеими командами и просьба расследовать / прояснить проблему и скомпилировать NUnit с минимальным уровнем отладочной информации.

Редактировать:

Нашел еще один вариант.

  1. В моем случае снятие флажка "Подавлять оптимизацию JIT при загрузке модуля" также помогает, даже если библиотеки скомпилированы без отладочной информации.Однако это работает только тогда, когда проект запущен в конфигурации выпуска.

Я думаю, что вы ослеплены утверждением NUnit.Вы могли бы добиться того же с помощью простой попытки / улова.

try
{
  _testInstance.TestFunction(null);
  Assert.Fail("The method should have thrown...");
}catch{}

Теперь у вас есть все, что вам нужно.Вы терпите неудачу, если исключение не сгенерировано и ваш обычный код может обрабатывать исключения, как ожидалось.

Может ли это быть достижимо путем отключения Исключения?Откройте меню Debug /Exceptions и найдите свое Исключение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top