Возникли проблемы при получении NUnit's Assert.Throws для правильной работы - PullRequest
4 голосов
/ 06 марта 2010

Я мог бы поклясться, что использовал NUnit's Assert.Throws, чтобы определить, будет ли выброшено конкретное исключение из метода, но моя память подвела меня раньше . Я прочитал этот пост здесь на SO , но он не ответил на мой вопрос, так как я знаю правильный синтаксис, и я не хочу ничего делать с исключением, которое возвращается (я не хочу посмотреть на членов Исключения, хотя это может быть полезно в будущем).

Я написал модульные тесты, чтобы доказать, что у меня нет понимания в использовании словаря, и не смог заставить его обработать исключение KeyNotFoundException, которое выдается. Вместо того, чтобы NUnit перехватывал его и проходил тест, я получаю необработанную ошибку KeyNotFoundException при запуске. Я проверил, что у меня нет VS IDE, настроенной, чтобы сломать на исключениях .NET.

Я пробовал это двумя способами:

Assert.Throws( typeof(KeyNotFoundException), () => value = prefs["doesn't exist"]);

и

Assert.Throws<KeyNotFoundException>( () => value = prefs["doesn't exist"]);

но оба приводят к необработанному исключению. Что мне здесь не хватает?

ОБНОВЛЕНИЕ похоже, что другие не могут воспроизвести это. Вот скриншот:

alt text

Ответы [ 4 ]

3 голосов
/ 22 апреля 2011

Это старый поток, но попробуйте отключить параметр «Включить только мой код» в Visual Studio в меню «Инструменты» -> «Параметры».При этом отладчик пытается быть полезным и останавливается на последней возможной точке вашего кода, прежде чем исключение будет проглочено.

Или, по крайней мере, это мое понимание этого.

ЕслиВы отключаете Включить только мой код, Assert.Throws должен работать правильно.

2 голосов
/ 06 марта 2010

Не прямой ответ, но я лично предпочитаю помечать свои тесты

[ExpectedException(typeof(KeyNotFoundException))]
public Test ShouldDoTheStuff() {

  ...

}

Это работает для вас? Я не вижу ничего плохого в вашем коде как таковом.

2 голосов
/ 27 апреля 2010

Отладчик утверждает, что ваше исключение не обрабатывается кодом пользователя, что технически верно. Для демонстрации я буду использовать образец теста, предоставленный

[Test]
public void demonstrateThatExceptionThrown()
{
    string value;
    Dictionary<string, string> test = new Dictionary<string, string>();
    Assert.Throws(typeof(KeyNotFoundException), () => value = test["h"]);
}

Когда вы выполните его, вы получите предупреждение в VisualStudio, что исключение не обрабатывается в коде пользователя. Если вы посмотрите на стек вызовов, вы увидите что-то вроде

[External Code]
CodeTests.DLL!CodeTests.MiscTests.demonstrateThatExceptionThrown.AnonymousMethod()
[External Code]
CodeTests.DLL!CodeTests.MiscTests.demonstrateThatExceptionThrown()
[External Code]

Поскольку вы указали делегата, исключение происходит в созданном «AnonymousMethod». Это называется .Net Framework. Отладчик останавливается, потому что ваш делегат не обрабатывает исключение до того, как оно будет передано обратно в платформу. Неважно, что дальше вверх по стеку это может быть обработано в вашем коде (возможно, поскольку нет способа гарантировать, что внешний код будет правильно обрабатывать исключение.)

Чтобы VisualStudio рассматривал это как обработанное исключение, используйте атрибут ExpectedException и удалите делегат, например, так:

[Test]
[ExpectedException(typeof(KeyNotFoundException))]
public void demonstrateThatExceptionThrown()
{
    string value;
    Dictionary<string, string> test = new Dictionary<string, string>();
    value = test["h"];
}
0 голосов
/ 06 марта 2010

ДАЖЕ БОЛЬШЕ НОВОГО ОБНОВЛЕННОГО ОТВЕТА!

После нашего разговора в комментариях, добавленных к этому ответу, я подозреваю, что проблема с nunitit test runner. Я не верю, что с вашим тестом что-то не так, поскольку у меня нет проблем с его выполнением ни с помощью графического интерфейса NUnit, ни с отличным средством выполнения тестов Resharper.

ОБНОВЛЕННЫЙ ОТВЕТ

Увидев ваш снимок экрана, я попытался пройти тест с помощью отладчика и увидел точно такой же запрос о необработанном исключении. Если я продолжу обходить эту ошибку, тест пройден, когда я достигну конца утверждения.

Когда я запускаю тест в режиме без отладки с использованием графического интерфейса NUnit или средства запуска Resharper 4.5, тест проходит каждый раз, как и ожидалось.

Извините, что задал очевидный вопрос, но с чем вы проводите тест? то есть какой тестовый бегун?

Точный код, который я выполнил:

using System;
using System.Collections.Generic;
using NUnit.Framework;

namespace ClassLibrary1
{
    [TestFixture]
    public class DictionaryTest
    {


        [Test]
        public void demonstrateThatExceptionThrown()
        {
            string value;
            Dictionary<string, string> test = new Dictionary<string, string>();
            Assert.Throws(typeof(KeyNotFoundException), () => value = test["h"]);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...