测试工厂方法

时间:2015-09-12 15:58:28

标签: php unit-testing phpunit

将测试写入覆盖范围100%代码是我们应该尝试实现的。但我想出了一些我不知道如何测试方法的场景(工厂方法):

flex-basis

该方法的目的是创建文档的快捷方式,而不是每次都写3行。

如何测试此方法?

或许这就是为什么我们有@codeCoverageIgnoreStart块的情况?正是由于这个原因,PHPUnit提供了这种注释。

编辑: 这种方法背后的主要思想是让客户生活更轻松。没有更多,没有配置等(但该方法将是一个很好的地方)。

public function getDocument(){
    $document = new Document();
    $document->settings(new Settings());
    $document->filesystem(new Filesystem('e:'));
    return $document;
}

也许我应该问一下,如果我真的应该提供这种方法,想要使用文档的用户应该知道依赖,不应该隐藏。

3 个答案:

答案 0 :(得分:3)

Inject your dependenciesDocumentSettingsFilesystem)通过构造函数,然后根据需要使用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的对象是否与配置要返回的模拟的对象相同

变体就是DocumentDocument作为getSettings工厂的方法。在这种情况下,您应该创建Factory的部分模拟,并设置对它的期望。因此调用了真正的getFilesystem方法,但是当调用DocumentgetDocument方法时,您将返回受控实例。

方法2

传递实际的依赖关系:

getSettings

在测试中,你应该:

  • 创建getFilesystem实例或模拟
  • 创建public function getDocument(Settings $settings, Filesystem $filesystem) { $document = new Document(); $document->settings($settings); $document->filesystem($filesystem); return $document; } 实例或模拟
  • 调用Settings方法,传递FilesystemDocumentFactory。检查是否返回了Settings对象
  • 检查分配给Filesystem的对象是否与传递给工厂方法的实例相同

答案 2 :(得分:-2)

有点我找到答案:这段代码是不可测试的。

  

无论你在被测方法中有新的XXX(...),都注定要失败。

更多: https://stackoverflow.com/a/7763207/2490611

相关问题