针对早期回报的测试(防御性编程)

时间:2016-07-29 10:29:05

标签: unit-testing testing phpunit

我正在学习测试并尝试使用“早期回报”来测试功能。成功函数在另一个类中设置属性,并且在失败时简单地返回,因此在两种情况下它都返回'空隙。

class Test
{
    private $fileHandler;
    private $config;

    public __constructor($fileHandler, $config)
    {
        $this->fileHandler = $fileHandler;
        $this->config = $config;
    }

    public function example($filePath)
    {
        $exists = $this->fileHandler->exists($filePath);

        if ($exists === false) {
             return;
        }

        $this->config->set($filePath);
    }
}

在这个例子中我相信我可以通过两个单元测试和模拟fileHandler类来测试它。

对于失败(提前返回),不应该调用$config类的方法set(),而为了成功,应该调用该方法。

但是,如果我尝试将never()更改为once(),我认为整个测试都是假的。

/** test */
public function config_is_not_set_with_missing_file()
{
    $fileHandlerMock = $this->getMockBuilder(fileHandler::class)->getMock;
    $fileHandlerMock->method('exists')
        ->willReturn('false');
    $configMock = $this->getMockBuilder(config::class)->getMock;

    $test = new Test($fileHandlerMock, $configMock);
    $test->example('fake file path');

    $configMock->expects($this->never())
        ->method('set');
}

2 个答案:

答案 0 :(得分:1)

您未将$configMock传递给Test构造函数,因此未使用它。

你是对的,如果测试通过了oncenever预期,则测试无法正常工作,需要对其进行审核。

答案 1 :(得分:1)

您的文件处理程序mock返回字符串'false'!==false。将其更改为falseTets::example应尽早返回。