繁体   English   中英

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

[英]Mocking Symfony Entities for Unit Testing using PHPUnit and Mockery

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是被ReportRepository的存储库类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM