如何模拟在单元测试中随机代码点抛出异常?

时间:2013-03-05 12:04:50

标签: c# unit-testing exception exception-handling

我已阅读this question关于模拟抛出异常的信息。答案建议我创建一个假装成为真实对象的模拟对象。

这不是我想要的。如果我替换一个真实的对象,我会失去一部分真正的代码。我希望以最小的更改调用实际代码,并在该代码的随机点从内部抛出异常。

是否有可能在从单元测试中调用的随机代码点抛出异常?

3 个答案:

答案 0 :(得分:3)

不要将随机性放入单元测试中。它只会给你带来麻烦。单元测试应始终具有一定的一致性。特别是如果你想让他告诉你红色时出了什么问题。如果你实施一个随机异常投掷到你的单元测试中,可能会发生他有时会崩溃并返回一个红色条。也许下一次运行它错误再次消失。这真的不是单元测试的用途,你会遇到很大的麻烦,找出曾经发生过失败测试的问题。

更好的方法是系统地测试代码的关键部分。用模拟对象替换每个关键方法,该对象抛出要测试的异常类型并覆盖每个测试用例。这将为您提供有关在查找错误时出现问题的更多信息。

希望这会有所帮助。

答案 1 :(得分:1)

我可以考虑这项工作。

1-创建一个名为RandomException()的函数;如果随机值可被3整除,则throw异常,否则不会抛出异常。确保此函数包含在此代码块中。

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

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

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

答案 2 :(得分:1)

看起来你正在尝试测试异常处理,我不认为这是一个很好的方法来随机抛出异常并检查它是否适合,如果你需要在某些条件下测试处理你需要模拟条件在一个真实的对象中,就像一个应该导致例外的非法情况。

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