【问题标题】:How to properly test php repositories如何正确测试 php 存储库
【发布时间】:2017-01-27 07:48:58
【问题描述】:

我正在尝试为我的存储库编写集成测试。对于简单的存储库,这似乎很容易。我做了这样的事情

class DBStatusRepositoryTest extends SmBaseIntegrationMemory
{
    private $dbStatusRepository;

    public function setUp()
    {
        parent::setUp();

        $this->dbStatusRepository = new DBStatusRepository($this->dbConnection);
    }

    public function testShouldReturnAStatusEntity()
    {
        $status = $this->dbStatusRepository->getById(1);
        $this->assertInstanceOf('Acme\Modules\Foo\Model\Status', $status);
    }
}

查询状态存储库应该返回一个状态实体。

但我不确定如何处理像这样的更复杂的存储库:

public function testAddAttachment()
{
    $itemId = 420807;
    $user = new User([//** data ** //];
    $attachment = new Attachment();
    $attachment->setUser($user);
    $attachment->setSomething('something');
    $attachment->set....;

    $this->dbAttachmentRepository->addAttachmentForItem($itemId, $attachment);
    $attchments = $this->dbAttachmentRepository->getAllForLead($itemId);
    $this->assertCount(1, $attchments);
}

这段代码还测试了所有通过的依赖项。我不确定这是否可以。

此外,在设置存储库时,我们可以有这样的依赖树:

$userRepository = new DBUserRepository($this->dbConnection);
$attachmentFactory = new AttachmentFactory($userRepository);
$this->dbAttachmentRepository = new DBAttachmentRepository($this->dbConnection, $attachmentFactory);

这是对存储库执行集成测试的正确方法吗?

更新:更具体地说,我已经在使用 DBUnit 和内存中的 sqlite 数据库,每次运行测试文件时都会填充该数据库。但是,我的问题是指是否可以实例化某些与存储库相关的操作所需的所有依赖项。

谢谢

【问题讨论】:

    标签: php integration-testing ddd-repositories


    【解决方案1】:

    实际上,据我了解,在集成测试中,您希望使用真实边界测试您的存储库。

    所以我不会创建对象并将它们放入存储库,而是直接将数据插入您的数据库,测试您是否可以获取数据并将其从数据库中删除。

    您可以手动完成,也可以使用 DBUnit

    在您进行直接插入的每个测试之前,存储插入的 ID,然后使用存储库检索数据,然后使用存储的 ID 清理数据库。

    使用 DBUnit,您可以创建 XML/CSV/YAML 文件,您可以在其中定义数据,DBUnit 会自动为您进行插入和清理。

    https://phpunit.de/manual/current/en/database.html

    【讨论】:

    • 我在内存中使用 sqlite 测试数据库和 dbunit,我正在用虚拟数据填充数据库。但是,我不想读取数据,而是想测试数据的插入。请看我上面的第二个例子。我的问题是如何处理具有依赖树的存储库。
    • 我只是将我的手动测试反映到 PHPUnit。假设您不会使用测试,您将如何测试插入?您将检查数据库,看看是否有预期的条目。因此,在“addAttachmentForItem”之后,我只需向特定表调用普通 SQL 请求并检查值。也许在预期的 stdClass 之前创建以便于补偿
    • 这正是我正在做的。 $attchments = $this->dbAttachmentRepository->getAllForLead($itemId);对内存中的测试数据库执行查询。同样,我的问题与附件实体和用户实体有关!为什么 DBAttachmentRepositoryTest 类的工作是测试/实例化这些?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-17
    • 2014-06-19
    • 2014-10-07
    • 2019-01-29
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多