你好,我已经写了单元测试,在我的测试套件,我需要有关的服务单元测试。我得到的设置方法,如
protected function setUp(): void
{
parent::setUp();
$this->delayReportService = self::getContainer()->get(DelayReportService::class);
}
在这个测试类中,我只想测试一个与类依赖无关的方法,所以我模拟了它的所有依赖,如下所示:
protected function setUp(): void
{
parent::setUp();
$this->delayReportService = new DelayReportService(
$this->createMock(RedisQueueStorageClientInterface::class),
$this->createMock(OrderRepository::class),
$this->createMock(DelayReportRepository::class),
$this->createMock(EstimatedArrivalTimeClientInterface::class),
$this->createMock(ParameterBagInterface::class)
);
}
当我们在测试中不需要依赖关系时,我们模仿它们,这是最好的实践吗?在集成测试中,我们不应该使用模仿对吗?
1条答案
按热度按时间tcomlyy61#
当我们在测试中不需要依赖关系时,我们模仿它们,这是最好的实践吗?在集成测试中,我们不应该使用模仿对吗?
简而言之,是的。模拟服务是好的,集成测试不应该使用模拟。
这取决于你想测试什么。两者都可以,但前者通常被称为集成测试,后者通常被称为单元测试。
看看你注入的服务,后者至少对RedisQueueStorageClientInterface或OrderRepository更有意义,因为它们在容器中的实际实现将使用实际的服务,这需要你在测试中运行redis和数据库。你也可以在测试环境中使用这两种服务的替代实现,例如将数据作为PHP数组存储在内存中。
您也可以使用混合方法,也就是说,从容器中提取其他服务,而不是这些服务。同样,您可以对这些服务和实际实现使用模拟,您可以自己示例化它们,而不是从容器中提取它们。
这两种测试方法各有优缺点,因此没有明确的答案。