模擬類
使用驗證期望的測試 double 替換物件的實踐,例如斷言已呼叫方法,被稱為模擬。
讓我們假設我們有 SomeService 來測試。
class SomeService
{
private $repository;
public function __construct(Repository $repository)
{
$this->repository = $repository;
}
public function methodToTest()
{
$this->repository->save('somedata');
}
}
我們想測試 methodToTest
是否真的稱為儲存庫的 save
方法。但是我們不想實際例項化儲存庫(或者 Repository
只是一個介面)。
在這種情況下,我們可以模擬 Repository
。
use PHPUnit\Framework\TestCase as TestCase;
class SomeServiceTest extends TestCase
{
/**
* @test
*/
public function testItShouldCallRepositorySavemethod()
{
// create an actual mock
$repositoryMock = $this->createMock(Repository::class);
$repositoryMock->expects($this->once()) // test if method is called only once
->method('save') // and method name is 'save'
->with('somedata'); // and it is called with 'somedata' as a parameter
$service = new SomeService($repositoryMock);
$service->someMethod();
}
}