私はテストを学習しており、「early returns」を使用して関数をテストしようとしています。成功の関数は別のクラスのプロパティを設定し、失敗した場合は単に両方の場合に戻り値が返されます。この例では早期返品(防御プログラミング)に対するテスト
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);
}
}
Iは Iは、2回のユニットテストで及び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');
}
その理由がわからないのですが、 '$ test-> example()'文を実行する前にモックを設定する必要があります – gontrollez
注意! '' false '!== false'!あなたの模擬関数は、内容が "false"で、ブール値* false *ではない文字列を返します。 – helmbert