C++ 如何断言未引发异常?

C++ 如何断言未引发异常?,c++,windows,unit-testing,exception,visual-studio-2013,C++,Windows,Unit Testing,Exception,Visual Studio 2013,我正在为我的应用程序使用Visual Studio 2013中的单元测试功能 我正在尝试为一个类编写一个测试,通过该测试,您可以将特定对象传递给构造函数,并且根据传递的对象的状态,可能会引发异常 我已经为每个对象状态编写了存根,并为构造函数将抛出异常的场景编写了测试用例,如下所示: TEST_METHOD(constructor_ExceptionRaised) { // arrange const InvalidStub stub; // act auto a

我正在为我的应用程序使用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);
}
我不确定我是否也需要使提出的“任何异常”失败,因为这应该由测试运行者(即,测试失败)来处理。根据同样的推理,以下测试本质上是相同的:

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

    // act
    const Foo foo(stub);

    // assert
    // no exception
}

我使用以下测试方法来说明构造函数不会引发异常:

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

    // act
    const Foo foo(stub);

    // assert
    Microsoft::VisualStudio::CppUnitTestFramework::Assert::IsTrue(true);
}
当引发异常时,测试自动失败。故障消息中给出了异常详细信息


当没有引发异常时,测试将通过,因为我正在断言两个
catch
块中的
true==true

,其中一个块必然是冗余的(因为它们的作用相同)。无论如何,一种可能的替代方法是从
act
函数返回发生了什么的指示器。使用测试框架的相关方法检查返回值。我对Visual Studio的单元测试框架一无所知,但如果异常从测试方法传播出去,大多数单元测试框架将无法通过测试。@cheers-sandhth.-Alf-如果函数返回void,断言函数指针是无效指针是否有效?@immibis-是的,这是正确的,因此根据这个基础,我的最后一个测试示例是否足以测试没有引发异常?@rasteve:“断言函数指针是无效指针”的确切含义是什么?函数指针永远不是
void*
TEST_METHOD(constructor_NoException)
{
    // arrange
    const ValidStub stub;

    // act
    const Foo foo(stub);

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