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