使用PHPUnit和Mockery模拟Symfony实体进行单元测试


public function reportsToBeRun()
{
    $reports = $this->repository->getReportsToBeRun();
    foreach ($reports as $report) {
        $report->setUpdated(new DateTime());
    }
    return $reports;
}

正在新工作中学习测试驱动开发,我正在努力测试上述示例。我调用使用 getResults() 并返回实体对象数组的存储库。我可以很好地模拟存储库,但我不知道我最好回到这里。我可以模拟实体并返回它们,但setUpdated不会做任何事情。我显然可以模拟setUpdated,但我不知道如何让它更新模拟的一个或多个实体。

我的第二个问题是我正在编写的测试并没有真正测试任何东西。存储库调用被模拟,资源库也是如此。然后我只是归还我嘲笑的东西。对于这样的函数,您建议做什么。

我不会嘲笑这些实体,因为它们是普通的旧PHP对象,不会访问外部资源。

最好模拟存储库并让它返回实体集合:

class MyTest extends PHPUnit_Framework_TestCase
{
    private $service;
    protected function setUp()
    {
        parent::setUp();
        $this->service = new ReportService($this->createRepositoryMock());
    }
    protected function tearDown()
    {
        $this->service = null;
        parent::tearDown();
    }
    public function testReportsToBeRun()
    {
        $reports = $this->service->reportsToBeRun();
        $now = new DateTime();
        foreach ($reports as $report) {
            $this->assertInstanceOf(Report::class, $report);
            $this->assertTrue($report->getUpdated() <= $now);
        }
    }
    private function createRepositoryMock()
    {
        $mock = Mockery::mock(ReportRepository::class);
        $reports = [
            $this->createReport(1),
            $this->createReport(2),
            $this->createReport(3),
        ];
        $mock->shouldReceive('getReportsToBeRun')->andReturn($reports);
    }
    private function createReport($id)
    {
        $report = new Report();
        $report->setId($id);
        return $report;
    }
}
  • ReportService是包含reportsToBerun方法的服务。
  • Report是实体类。
  • ReportRepository是被模拟的存储库类。

最新更新