针对早期 returns 进行测试(防御性编程)

Testing against early returns (defensive programming)

我正在学习测试并尝试使用 'early returns' 测试函数。成功的函数在另一个 class 中设置一个 属性 ,失败时简单地设置 returns 所以在这两种情况下它 'returns' void.

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 class.

来测试它

对于失败(早期 return),不应调用 $config class 的方法 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');
}

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

你是对的,如果测试同时通过 oncenever 预期,则测试未按预期工作,需要对其进行审查。

您的文件处理程序 mock 在 return 字符串 'false' 中,即 !==false。将其更改为 false 并且 Tets::example 应该 return 早。