模拟对象的一个方法

3
我有一个名为PhotoOrganiser的类,正试图对其方法SortAll进行单元测试。该方法调用了该类中的另一个方法MovePhoto
正确的做法是什么?使用Moq,我已经模拟出SortAll引用的其他类,但据我所知,没有办法只模拟对象的一个方法而不模拟对象本身。最干净的方法是创建一个新的子类,覆盖MovePhoto吗?

请访问https://github.com/Moq/moq4/wiki/Quickstart,并使用Ctrl + F查找“partial”。 - zerkms
Zerkms 是正确的。你要找的东西是 partial mockMoq 支持它。 - MarcinJuraszek
谢谢大家,我忘了那一点了。那样做的话,我需要将方法覆盖为虚方法吗?这样做纯粹是为了测试而不是在程序本身中使用,这被认为是个好习惯吗? - tsvallender
@tsvallender 我在必要时使用部分模拟。不确定社区是否认为这是好还是坏 :-) - zerkms
我的看法是:不要这样做。你应该像任何使用者一样测试类的公共API,因此应相应地测试逻辑。不要逐个测试“方法”,而是通过调用/行为进行测试。尝试一下TDD,这正是你最终要做的。 - Pierre-Luc Pineault
1个回答

1

您不应该需要模拟MovePhoto。您的SortAll方法听起来应该很容易进行断言,观察结果(照片被排序)。

我建议重新审视设计。也许PhotoOrganizer类太复杂了?也许移动照片足够大,值得拥有自己的类?考虑一下在SortAll方法中内联MovePhoto用法会发生什么。我意识到PhotoOrganizer可能看起来像一个好名字,考虑到应用程序目的,但在面向对象编程中,组织者可能会呼吁SRP违规。设计问题通常很快就会通过难以编写单元测试凸显出来。

总的来说,您可以像其他人提到的那样使用部分模拟来解决它(是的,它需要方法是虚拟的)。但这是治标不治本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接