gpt4 book ai didi

c# - 单元测试多级异常——在哪里停止?

转载 作者:太空狗 更新时间:2023-10-30 01:10:26 26 4
gpt4 key购买 nike

假设我有 3 个类,每个类都有一个负责任的(和方法)。我们还假设这些类具有便于依赖注入(inject)的接口(interface)。 A 类调用 B 类的接口(interface),B 类调用 C 类的接口(interface)。如果 C 类抛出 NotAPrimeNumberException(如果说,int 参数不是质数),我希望有一个单元测试来确保如果传入的参数不是质数,C 将抛出 NotAPrimeNumberException。到目前为止一切顺利。

我目前相信单元测试提供了我理解被测试方法的行为所需的所有文档。因此,上述单元测试类似于 MakeSureNotAPrimeNumberExceptionIsThrownIfNumberisNotPrimeTest()。

B 类知道 C 类可以抛出 NotAPrimeNumberException。如果我想让 NotAPrimeNumberException 从类 B 中冒出来,我应该为类 B 编写一个单元测试以某种方式检查在某些情况下是否抛出 NotAPrimeNumberException 吗? A级呢?如果 A 也让 NotAPrimeNumberException 冒泡,它是否也应该对此进行单元测试?

我担心的是,如果我不在 B 类中编写单元测试,那么 B 类的使用者将不会意识到 B 类可以抛出此类异常。但是,如果我确实编写了单元测试,那么我必须强制调用 B 类以抛出 NotAPrimeNumberException 只是为了不处理 B 类中的异常,这有点愚蠢。如果我不编写单元测试,那会怎样是在 API 中记录可能发生此异常的适当方式(如果有的话)吗?

额外的问题是您如何使用 Rhino-mocks 在 NUnit 中促进这一点?这当然取决于前两个问题。

最佳答案

如果类 A 和 B 期望与之协作的类有某些行为,那么您应该进行测试以确保这些行为发生。如果你想通过从 A 到 B 到 C 的硬连线调用来避免你正走向的巨大泥球,那么你应该应用好莱坞原则/DIP 来打破这种依赖性。 A 应该依赖于 IB(B 的接口(interface))而不是 B 的实例。然后 A 的测试可以简单地断言 A 做了它应该做的事情,包括在 IB 抛出的异常面前正确地行动(或忽略它们) .同样,B 可以依赖于 C、IC 的接口(interface),B 的测试同样可以忽略 C 可能做什么或不做什么的细节,而只关注 B 做了什么。

将 A 连接到 B 再到 C 的集成测试将能够验证这些类是否正确协作,并且还可以确保 C 中引发的异常从 A 中冒出来(如果您是这样的话)想要发生。如果后来发现 C 只是返回 null 而不是引发异常,那么您的集成测试就会失败,您会看到新的行为已经发生。但是,我不会倾向于将我的单个单元测试与显示如果事情中断异常会冒泡的测试混为一谈,因为这是默认行为。相反,我可能会测试我引发的任何新异常是否在预期时抛出,并且我执行的任何异常处理是否按我预期的方式工作。这是因为在单元测试中,您应该只测试被测代码,而不是协作者的行为。

关于c# - 单元测试多级异常——在哪里停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4738408/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com