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

标签 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 也是如此。然后我只是返回我 mock 的任何东西。对于这样的功能,您会推荐做什么。

最佳答案

我不会 mock 这些实体,因为它们是普通的旧 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 是模拟的存储库类。

关于php - 使用 PHPUnit 和 Mockery 模拟 Symfony 实体进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42982836/

相关文章:

api - Laravel API测试-如何测试具有外部API调用的API

php - 如何通过 PHP 单元测试避免竞争条件

php - 向 Wordpress 中现有的 WP_Query 添加条件

php - 使用 COUNT 函数计算新消息的数量?

database - 命名空间表上的 Doctrine 关系

php - Shopware 6 : association with nested association, 这可能吗?

php - 如何列出 MediaWiki 中的所有用户?

php - 不使用 sql 外键的缺点

php - Sonata Admin Bundle 自定义查询列表以使用现有存储库

PHPUnit:从实例运行测试