2013-03-05 93 views
3

我读过this question关于模拟抛出异常。解决方案建议我创建一个伪装对象,假装是一个真正的对象。如何模拟在单元测试中的随机代码点抛出异常?

这不是我想要的。如果我更换一个真实的物体,我会失去一部分真实的代码。我想用最少的修改来调用实际的代码,并且在代码的随机点引发一个异常。

是否有可能在单元测试中调用的随机代码点处引发异常?

+0

你想测试异常处理吗? – CloudyMarble 2013-03-05 12:15:06

+0

测试错误处理时,丢失部分实际代码会出现什么问题?你不应该在同一个测试中测试真正的代码和错误处理。 – adrianm 2013-03-05 12:17:06

+0

您也许可以在随机点向您的对象生成的托管代码注入一些代码。 – ipavlic 2013-03-05 12:27:53

回答

3

不要把随机性放到你的单元测试中。它只会给你带来麻烦。单元测试应该始终有一些一致性。特别是如果你想让他告诉你当他变红时出了什么问题。如果你执行一个随机异常抛入你的单元测试,可能会发生他有时会崩溃并返回一个红色的条。也许下次运行它的错误再次消失。这实际上并不是单元测试在这里进行的,你会遇到很大的麻烦,发现这个曾经发生过的失败测试的问题。

更好的方法是系统地测试代码的关键部分。用模拟对象替换每个关键方法,该对象引发您要测试的异常类型,并覆盖每个测试用例。这会给你更多关于当你正在寻找错误时出错的信息。

希望这有助于。

2

我可以考虑一下这项工作。

1-制作一个名为RandomException()的函数; throw异常如果一个随机值可以被3整除,否则它不会抛出异常。确保这个函数被封装在这个代码块中。

#if DEBUG 
void RandomException() 
{ 
    // gen random value 
    // if random value % 3 == 0 throw the exception now 
} 
#else 
void RandomException() 
{ 
} 
#endif 

这种方式当你释放代码时,这些函数调用不会影响程序。

我希望这个想法可以帮助你。

+0

如何从我的代码的随机点调用此函数? – sharptooth 2013-03-05 12:30:11

+0

这不是TestProject的工作原理。至少不是我工作的地方。您的产品是否附带测试代码? – Default 2013-03-05 12:33:44

+0

@默认:不,我们不“运送”产品,我们运行和维护Web服务,因此客户永远不会持有我们的代码。 – sharptooth 2013-03-05 12:37:11

1

看起来好像你试图测试异常处理,我不认为这是一个很好的方法随机抛出一个异常,并检查它是否得到cought,如果你需要在某些条件下测试处理,你需要模拟一个真实的物体的状况,就像应该引起例外的非法情况。

你仍然可以通过一个局部varibale产生这种行为,你可以从外部设置(在你的Unittest中),这将导致代码根据这个变量抛出一个异常,但正如我认为它不是一个好方法。