针对早期 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
构造函数,因此它没有被使用。
你是对的,如果测试同时通过 once
和 never
预期,则测试未按预期工作,需要对其进行审查。
您的文件处理程序 mock 在 return 字符串 'false'
中,即 !==
到 false
。将其更改为 false
并且 Tets::example
应该 return 早。
我正在学习测试并尝试使用 '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
构造函数,因此它没有被使用。
你是对的,如果测试同时通过 once
和 never
预期,则测试未按预期工作,需要对其进行审查。
您的文件处理程序 mock 在 return 字符串 'false'
中,即 !==
到 false
。将其更改为 false
并且 Tets::example
应该 return 早。