簡體   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