我读过this question关于模拟抛出异常。解决方案建议我创建一个伪装对象,假装是一个真正的对象。如何模拟在单元测试中的随机代码点抛出异常?
这不是我想要的。如果我更换一个真实的物体,我会失去一部分真实的代码。我想用最少的修改来调用实际的代码,并且在代码的随机点引发一个异常。
是否有可能在单元测试中调用的随机代码点处引发异常?
我读过this question关于模拟抛出异常。解决方案建议我创建一个伪装对象,假装是一个真正的对象。如何模拟在单元测试中的随机代码点抛出异常?
这不是我想要的。如果我更换一个真实的物体,我会失去一部分真实的代码。我想用最少的修改来调用实际的代码,并且在代码的随机点引发一个异常。
是否有可能在单元测试中调用的随机代码点处引发异常?
不要把随机性放到你的单元测试中。它只会给你带来麻烦。单元测试应该始终有一些一致性。特别是如果你想让他告诉你当他变红时出了什么问题。如果你执行一个随机异常抛入你的单元测试,可能会发生他有时会崩溃并返回一个红色的条。也许下次运行它的错误再次消失。这实际上并不是单元测试在这里进行的,你会遇到很大的麻烦,发现这个曾经发生过的失败测试的问题。
更好的方法是系统地测试代码的关键部分。用模拟对象替换每个关键方法,该对象引发您要测试的异常类型,并覆盖每个测试用例。这会给你更多关于当你正在寻找错误时出错的信息。
希望这有助于。
我可以考虑一下这项工作。
1-制作一个名为RandomException()的函数; throw
异常如果一个随机值可以被3整除,否则它不会抛出异常。确保这个函数被封装在这个代码块中。
#if DEBUG
void RandomException()
{
// gen random value
// if random value % 3 == 0 throw the exception now
}
#else
void RandomException()
{
}
#endif
这种方式当你释放代码时,这些函数调用不会影响程序。
我希望这个想法可以帮助你。
如何从我的代码的随机点调用此函数? – sharptooth 2013-03-05 12:30:11
这不是TestProject的工作原理。至少不是我工作的地方。您的产品是否附带测试代码? – Default 2013-03-05 12:33:44
@默认:不,我们不“运送”产品,我们运行和维护Web服务,因此客户永远不会持有我们的代码。 – sharptooth 2013-03-05 12:37:11
看起来好像你试图测试异常处理,我不认为这是一个很好的方法随机抛出一个异常,并检查它是否得到cought,如果你需要在某些条件下测试处理,你需要模拟一个真实的物体的状况,就像应该引起例外的非法情况。
你仍然可以通过一个局部varibale产生这种行为,你可以从外部设置(在你的Unittest中),这将导致代码根据这个变量抛出一个异常,但正如我认为它不是一个好方法。
你想测试异常处理吗? – CloudyMarble 2013-03-05 12:15:06
测试错误处理时,丢失部分实际代码会出现什么问题?你不应该在同一个测试中测试真正的代码和错误处理。 – adrianm 2013-03-05 12:17:06
您也许可以在随机点向您的对象生成的托管代码注入一些代码。 – ipavlic 2013-03-05 12:27:53