模擬類

使用驗證期望的測試 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();
    }
}