我有一个小型的Web应用程序,通过gui前端执行一些简单的数据。
所以当使用点击“保存”时,数据会被保存。在运行时异常中,我捕获异常,记录它并显示“抱歉等”。标签
因为这段代码通常不会失败,特别是当我想要它时,我无法看到我的“对不起”标签是否显示以及“成功保存”标签是否隐藏。
对此有一个很好的解决方案吗?
我能想到的唯一方法是创建一个抛出异常的存根,并在我想检查'fail'场景时通过ioc加载该存根。 这会产生一些额外的工作,当我第一次想要测试步骤1的失败,然后测试步骤1的成功和步骤2的失败时,这对我没有帮助。
我现在通过插入(和删除)一些抛出异常命令来手动完成它,但这当然不是很可靠。
答案 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);
}