If your public API depends on files or databases you can't unit test properly. So what do you do?
有一个可以使用的抽象级别。
- IFileSystem/ IFileStorage(用于文件)
- IRepository/ IDataStorage(用于数据库)
由于这个级别非常薄,它的集成测试将很容易编写和维护。所有其他代码都将是单元测试友好的,因为它很容易模拟与文件系统和数据库的交互。
On the one hand, you could try to friend your assemblies and test the features that are internal.
当他们的类违反单一职责原则 (SRP)并且不使用依赖注入 (DI)时,人们会面临这个问题。
有一个很好的规则,即类只能通过其公共方法/属性进行测试。如果其他人使用内部方法,那么测试它们是可以接受的。由于测试,不应将私有或受保护的方法设置为内部方法。
On the other hand, you could implement interfaces (only for the purpose of unit testing) and create fake objects within your unit tests.
是的,由于模拟框架的限制,接口很容易模拟。如果您可以创建一个类型的实例(假/存根),那么您的依赖项不应实现接口。
有时人们为他们的域实体使用接口,但我不支持它们。
为了简化处理假货的工作,使用了两种模式:
- 对象母亲
- 测试数据生成器
当我开始编写单元测试时,我从“Object Mother”开始。现在我正在使用“测试数据生成器”。
在Michael Feathers的《有效地使用遗留代码》一书中有很多好主意可以帮助你。