symfony 单元测试中的IOC容器或模拟

axkjgtzd  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(188)

你好,我已经写了单元测试,在我的测试套件,我需要有关的服务单元测试。我得到的设置方法,如

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)
        );
    }

当我们在测试中不需要依赖关系时,我们模仿它们,这是最好的实践吗?在集成测试中,我们不应该使用模仿对吗?

tcomlyy6

tcomlyy61#

当我们在测试中不需要依赖关系时,我们模仿它们,这是最好的实践吗?在集成测试中,我们不应该使用模仿对吗?
简而言之,是的。模拟服务是好的,集成测试不应该使用模拟。
这取决于你想测试什么。两者都可以,但前者通常被称为集成测试,后者通常被称为单元测试。
看看你注入的服务,后者至少对RedisQueueStorageClientInterface或OrderRepository更有意义,因为它们在容器中的实际实现将使用实际的服务,这需要你在测试中运行redis和数据库。你也可以在测试环境中使用这两种服务的替代实现,例如将数据作为PHP数组存储在内存中。
您也可以使用混合方法,也就是说,从容器中提取其他服务,而不是这些服务。同样,您可以对这些服务和实际实现使用模拟,您可以自己示例化它们,而不是从容器中提取它们。
这两种测试方法各有优缺点,因此没有明确的答案。

相关问题