c ++中单元测试的异常处理

时间:2010-11-15 09:06:11

标签: c++ unit-testing

我正在尝试在Nunit框架上测试c ++代码,但我不断收到以下异常

System.Runtime.InteropServices.SEHException : External Component has thrown an exception.

这被认为是完全正常的(我假设)无论如何我想忽略它。 (即使用ExpectedException)这是我的.h文件

 [Test, Description("Tests if an Entity has been successfully Locked")]
 void test_LockOperation();

和.cpp文件

 void TestDmObstacles::test_LockOperation()
{
  lockVal = DbtoDmObstaclesAdapter::lock( CmnGuid::parseString( L"3B6DB8F8-4BA7-DD11-B6A7-001E8CDE165C" ) );
  //When lock is successful the lockVal is 0
  Assert::AreEqual(0, lockVal);
}

我想使用ExpectedException,但我不知道如何在c ++中使用它。我也尝试了try / catch方法,但它没有用(我只是把Assertion放在catch块中)

PS:我不能使用另一个框架,它必须是Nunit

修改

这是我使用的try / catch方法

    void TestDmObstacles::test_LockOperation()
{
    try
    {
        lockVal = DbtoDmObstaclesAdapter::lock( CmnGuid::parseString( L"3B6DB8F8-4BA7-DD11-B6A7-001E8CDE165C" ) );
    }
    catch (...)
    {
        //Assert::Fail();
        Assert::AreEqual(0, lockVal);

    }
}

2 个答案:

答案 0 :(得分:2)

异常是预期,还是异常可接受

如果期望,那么您的单元测试框架应该有某种API,允许您声明预期的异常,并且如果没有发生则失败。通过文档快速浏览产生咒语:

[ExpectedException( "System.ArgumentException" )]

(将System.ArgumentException替换为您期望的异常。)

如果异常只是可接受的,那么我会说你的代码或测试都被破坏了。单元测试是测试预期的事情发生。如果您的测试中只有可能产生特定结果,那么您不会测试从测试到测试的单元的一致视图。因此,你并没有真正测试它。

例如,它可能表明您的代码正在泄漏应该处理的意外异常。

答案 1 :(得分:0)

您的代码示例与您尝试实现的内容不匹配:如果预期异常,则捕获它不应该使测试失败。

请注意,我不建议( at all )对catch (...)进行测试:任何抛出的异常都会导致相同的测试结果,我怀疑这是你想要的。< / p>