如何正确测试php存储库

如何正确测试php存储库,php,integration-testing,ddd-repositories,Php,Integration Testing,Ddd Repositories,我正在尝试为我的存储库编写集成测试。对于简单的存储库,这似乎很容易。我做了这样的事 class DBStatusRepositoryTest extends SmBaseIntegrationMemory { private $dbStatusRepository; public function setUp() { parent::setUp(); $this->dbStatusRepository = new DBStatus

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

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数据库,每次运行测试文件时都会填充该数据库。但是,我的问题是,是否可以实例化某些存储库相关操作所需的所有依赖项


谢谢

事实上,据我所知,在集成测试中,您希望使用真实的边界测试您的存储库

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

您可以手动或使用DBUnit来执行此操作

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

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


我正在使用内存中的sqlite测试数据库和dbunit,并用虚拟数据填充数据库。但是,我想测试数据的插入,而不是读取数据。请看我上面的第二个例子。我的问题是如何处理具有依赖关系树的存储库。我只是将我的手动测试反映到PHPUnit中。假设您不使用测试,您将如何测试插入?您将检查数据库,看看是否存在预期的条目。所以在“addAttachmentForItem”之后,我只需调用特定表的普通SQL请求并检查值。也许在预期的stdClass之前创建一个更容易补偿的stdClass这正是我正在做的$attchments=$this->dbAttachmentRepository->getAllForLead($itemId);对内存中的测试数据库执行查询。同样,我的问题与附件实体和用户实体有关!为什么DbaAttachEnterpositoryTest类的任务是测试/实例化这些内容?