Symfony:在功能测试中模拟 LDAP 组件

Posted

技术标签:

【中文标题】Symfony:在功能测试中模拟 LDAP 组件【英文标题】:Symfony : Mock LDAP Component in functional tests 【发布时间】:2021-03-28 04:28:41 【问题描述】:

我想对我的 Symfony (5.1) 应用程序进行功能测试,该应用程序使用 Active Directory 服务器作为“数据”数据库(创建、列出、更新数据)。我正在使用 Symfony ldap 组件。下面的代码示例可能包含拼写错误。

控制器

class DatasController

/**
     * @Route("/datas", name="datas")
     * @IsGranted("ROLE_USER")
     *
     * @return Response
     * @desc Displays LDAP datas
     */
    public function datasList(DatasRepository $datasRepository)
    
        $datas = $datasRepository->findAll();
        return $this->render('datas/list.html.twig', [
            'datas' => $datas,
        ]);
    

存储库

class DatasRepository

    private Ldap $ldap;
    private EntryManagerInterface $manager;

    /**
     * DatasRepository constructor.
     * Service injected params
     */
    public function __construct(Ldap $ldap, string $ldapAdminLogin, string $ldapAdminPwd)
    
        $this->ldap = $ldap->bind($ldapAdminLogin, $ldapAdminPwd);
        $this->manager = $ldap->getEntryManager();
    
    
    public function create(Data $data): void
    
        // ... some $data to Symfony\Component\Ldap\Entry $entry logic
        
        $this->manager->add( $entry );
    

    /**
     * @return datas[]
     */
    public function findAll()
    
        $this->ldap->query('ou=test', '(&(objectclass=person))');
        $entries = $query->execute()->toArray();

        // ... some $entries to $datas logic

        return $datas;
    
    

测试

class DatasControllerTest extends WebTestCase

    public function testDatasList()
    
        $client = static::createClient();
        $client->request('GET', '/datas');
        # Crash can't contact LDAP and thats logical
        $this->assertResponseIsSuccessful();
    

那么,如何对“GET /datas”进行功能测试呢? 我应该模拟代码的哪一部分以最大限度地提高测试效率和覆盖率?

一些附加信息:

我没有专用的 LDAP 服务器进行测试(测试在 Docker 通过 gitlab-ci) 我知道“不要嘲笑你不喜欢的东西 拥有”。 我读过很多帖子/文章说“你应该嘲笑 LdapAdapter”,但我不知道如何实现这一点,也没有 找到任何例子。

欢迎提出任何建议。 谢谢

埃里克

【问题讨论】:

【参考方案1】:

关于 mockin 外部服务:您可以从原始服务扩展测试服务,并使其方法按照您的意愿行事。例如:

class TestService extends \Symfony\OrAnyOtherExternalService

    public function getConnection()
    
        return new Connection([]);
    

然后在您的 services_test.yaml 中将此服务的类更改为您的测试服务:

services:
    Symfony\OrAnyOtherExternalService:
        class: TestData\Services\TestService

这种方式在测试环境应用程序将使用TestService而不是原来的

【讨论】:

是的,这就是我所做的,这是我认为最干净的方法,感谢您为其他人回答这个问题

以上是关于Symfony:在功能测试中模拟 LDAP 组件的主要内容,如果未能解决你的问题,请参考以下文章

在 symfony 4.4 的控制器中测试模拟服务

Symfony LDAP 自动登录

Symfony 3模拟服务功能测试phpunit和liip

Symfony 4 模拟私人服务

用于测试的 Symfony 模拟存储库

使用spring嵌入式ldap模拟活动目录进行集成测试