模拟类

使用验证期望的测试 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();
    }
}