我如何(单元)测试我对运行时异常的处理?

时间:2011-06-27 07:36:24

标签: c# asp.net unit-testing

我有一个小型的Web应用程序,通过gui前端执行一些简单的数据。

所以当使用点击“保存”时,数据会被保存。在运行时异常中,我捕获异常,记录它并显示“抱歉等”。标签

因为这段代码通常不会失败,特别是当我想要它时,我无法看到我的“对不起”标签是否显示以及“成功保存”标签是否隐藏。

对此有一个很好的解决方案吗?

我能想到的唯一方法是创建一个抛出异常的存根,并在我想检查'fail'场景时通过ioc加载该存根。 这会产生一些额外的工作,当我第一次想要测试步骤1的失败,然后测试步骤1的成功和步骤2的失败时,这对我没有帮助。

我现在通过插入(和删除)一些抛出异常命令来手动完成它,但这当然不是很可靠。

3 个答案:

答案 0 :(得分:3)

你应该做的是尽可能地将你正在执行的逻辑从前端解耦。然后,您可以编写一个测试,检查逻辑是否独立于UI而正确执行。

您可以从编写一个类开始,该类接受表示要保存的数据的对象,以及表示将执行保存的依赖项的接口(可能还有表示日志记录依赖项的接口)。然后,您可以编写传递模拟依赖项的测试,该依赖项配置为在正确的点处抛出异常,并且您可以检查验证的无效数据。您还可以验证日志记录是否按预期执行。此类可以返回一个表示函数成功与否的对象,您可以根据返回的对象显示消息。如果您正在使用MVC,那么您可以验证在发生错误的情况下返回正确的视图,但如果没有,那么就测试进行而言,您对UI逻辑有点困惑,并且您唯一真正的选择是制作那里的逻辑尽可能简单。

答案 1 :(得分:0)

确实可以编写一个测试来验证是否抛出了特定错误。查看http://www.nunit.org/index.php?p=exception&r=2.4 - 如果这是您的测试框架词,那么MSTest等效项是ExpectedExceptionAttribute:o)

答案 2 :(得分:0)

使用RhinoMocks并编写如下代码:

    [Test]
    public void Test()
    {

        //Mocking is initialized
        MockRepository mockRepository = new MockRepository();


        //Mock of interface is created
        ISomeClass someClass = mockRepository.Stub<ISomeClass>(); 


        //Setup that the method call results in an exception being thrown.
        someClass.Stub(x=> x.DoSomeThing()).Throw(new Exception());


        //Mock is "activated"
        mockRepository.ReplayAll();


        //Here the method is called and it does indeed throw an exception
        Assert.Throws<Exception>(someClass.DoSomeThing);

    }