2015-02-24 2 views
1

Я использую функции тестирования модулей в Visual Studio 2013 для моего приложения.Как утверждать, что исключение не было поднято?

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

Я написал заглушки для каждого состояния объекта, и написал тестовые случаи для сценариев, где конструктор будет сгенерированы исключением следующим образом:

TEST_METHOD(constructor_ExceptionRaised) 
{ 
    // arrange 
    const InvalidStub stub; 

    // act 
    auto act = [stub] { const Foo foo(stub); }; 

    // assert 
    Microsoft::VisualStudio::CppUnitTestFramework::Assert::ExpectException 
     <MyException>(act); 
} 

Как я должен подходить сценарий, в котором я хочу передать действительный заглушка и просто утверждать, что исключение не было поднято? Я хочу, чтобы меня беспокоили только то, что не было брошено (а не какое-либо исключение) конкретное MyException.

Я взломал вместе метод испытания следующим образом, но не уверен, если есть просто «1 линия» подход, который будет соответствовать моим потребностям:

TEST_METHOD(constructor_NoException) 
{ 
    // arrange 
    const ValidStub stub; 

    try 
    { 
     // act 
     const Foo foo(stub); 
    } 

    // assert 
    catch (MyException e) 
    { 
     Microsoft::VisualStudio::CppUnitTestFramework::Assert::Fail(); 
    } 
    catch (...) 
    { 
     Microsoft::VisualStudio::CppUnitTestFramework::Assert::Fail(); 
    } 
} 

Я не уверен, что я должен также не «любой исключение ", так как это должно (?) подбираться тестовым проводником (т. е. сбой теста). По той же причине, что следующий быть по существу такой же тест:

TEST_METHOD(constructor_NoException) 
{ 
    // arrange 
    const ValidStub stub; 

    // act 
    const Foo foo(stub); 

    // assert 
    // no exception 
} 
+0

Из двух блоков 'catch', один из них является излишним (поскольку они делают то же самое). Во всяком случае, одна из возможных альтернатив - вернуть индикатор того, что произошло, из функции 'act'. Использование соответствующих средств проверки проверки возвращаемого значения. –

+0

Я ничего не знаю о инфраструктуре модульного тестирования Visual Studio, но большинство модулей модульного тестирования не пройдут проверку, если исключение распространяется вне метода тестирования. – immibis

+0

@ Cheersandhth.-Alf - Если функция возвращает void, правильно ли утверждать, что указатель функции является указателем на пустоту? – camelCase

ответ

1

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

TEST_METHOD(constructor_NoException) 
{ 
    // arrange 
    const ValidStub stub; 

    // act 
    const Foo foo(stub); 

    // assert 
    Microsoft::VisualStudio::CppUnitTestFramework::Assert::IsTrue(true); 
} 

Когда исключение составляет поднятый тест автоматически терпит неудачу. Сведения об исключении указаны в сообщении об ошибке.

Если никакое исключение не поднято, тест пройдет, как я утверждаю true == true.

Смежные вопросы