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

时间:2017-03-23 17:20:23

标签: php doctrine phpunit mockery symfony-2.8

public function reportsToBeRun()
{
    $reports = $this->repository->getReportsToBeRun();

    foreach ($reports as $report) {
        $report->setUpdated(new \DateTime());
    }

    return $reports;
}

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

我的第二个问题是我写的测试并没有真正测试任何东西。存储库调用正在被模拟,setter也是如此。然后,我回到了我嘲笑的任何东西。你会建议你做这样的功能。

1 个答案:

答案 0 :(得分:0)

我不会模拟实体,因为它们是不能访问外部资源的普通旧PHP对象。

最好模拟存储库并让它返回一组实体:

Weapon w = new Ashbringer();
w = new TransmogrifiedWeapon(w, "Exodar Bastard Sword");
w = new EnchantedWeapon(w, "Scourgebane");
w.Render();
  • 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是被模拟的存储库类。