我正在尝试为我的存储库编写集成测试。对于简单的存储库,这似乎很容易。我做了类似的事情
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数据库。但是,我的问题是指是否可以实例化某些与存储库相关的操作所需的所有依赖项。
由于
答案 0 :(得分:0)
实际上据我所知,在集成测试中,您希望以真实的边界测试您的存储库。
所以我不是创建对象并将它们放入存储库,而是直接在数据库中插入数据,测试是否可以获取数据并从数据库中删除它。
您可以手动或使用DBUnit
在每次测试之前进行直接插入,存储插入的ID,然后使用存储库检索数据,然后使用存储的ID清理数据库。
使用DBUnit,您可以创建XML / CSV / YAML文件,您可以在其中自定义数据,DBUnit会自动为您进行插入和清理。