将测试写入覆盖范围100%代码是我们应该尝试实现的。但我想出了一些我不知道如何测试方法的场景(工厂方法):
flex-basis
该方法的目的是创建文档的快捷方式,而不是每次都写3行。
如何测试此方法?
或许这就是为什么我们有@codeCoverageIgnoreStart块的情况?正是由于这个原因,PHPUnit提供了这种注释。
编辑: 这种方法背后的主要思想是让客户生活更轻松。没有更多,没有配置等(但该方法将是一个很好的地方)。
public function getDocument(){
$document = new Document();
$document->settings(new Settings());
$document->filesystem(new Filesystem('e:'));
return $document;
}
也许我应该问一下,如果我真的应该提供这种方法,想要使用文档的用户应该知道依赖,不应该隐藏。
答案 0 :(得分:3)
Inject your dependencies(Document
,Settings
,Filesystem
)通过构造函数,然后根据需要使用test doubles。
同时重新考虑你的100%覆盖率政策,这绝对不是一件好事。
答案 1 :(得分:1)
将依赖项传递给factory方法,在其中初始化新对象,并正确配置它。在测试中,依赖项将是模拟而不是真实对象。
方法1
传递允许创建依赖项的工厂:
public function getDocument(SettingsFactory $sf, FilesystemFactory $ff){
$document = new Document();
$document->settings($sf->getSettings());
$document->filesystem($ff->getFilesystem());
return $document;
}
在测试中,你应该:
Settings
实例或模拟以及需要调用SettingsFactory
的{{1}}模拟并返回getSettings
实例Settings
实例或模拟以及需要调用Filesystem
的{{1}}模拟并返回FilesytemFactory
实例getFilesystem
方法,传递工厂。检查是否返回了Filesystem
对象DocumentFactory
的对象是否与配置要返回的模拟的对象相同 变体就是Document
和Document
作为getSettings
工厂的方法。在这种情况下,您应该创建Factory的部分模拟,并设置对它的期望。因此调用了真正的getFilesystem
方法,但是当调用Document
和getDocument
方法时,您将返回受控实例。
方法2
传递实际的依赖关系:
getSettings
在测试中,你应该:
getFilesystem
实例或模拟public function getDocument(Settings $settings, Filesystem $filesystem) {
$document = new Document();
$document->settings($settings);
$document->filesystem($filesystem);
return $document;
}
实例或模拟Settings
方法,传递Filesystem
和DocumentFactory
。检查是否返回了Settings
对象Filesystem
的对象是否与传递给工厂方法的实例相同答案 2 :(得分:-2)