【问题标题】:Symfony : Mock LDAP Component in functional testsSymfony:在功能测试中模拟 LDAP 组件
【发布时间】: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”,但我不知道如何实现这一点,也没有 找到任何例子。

欢迎提出任何建议。 谢谢

埃里克

【问题讨论】:

    标签: php symfony ldap phpunit functional-testing


    【解决方案1】:

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

    class TestService extends \Symfony\OrAnyOtherExternalService
    {
        public function getConnection()
        {
            return new Connection([]);
        }
    }
    

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

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

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

    【讨论】:

    • 是的,这就是我所做的,这是我认为最干净的方法,感谢您为其他人回答这个问题
    猜你喜欢
    • 2020-08-19
    • 2020-04-11
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-10
    • 2015-10-21
    • 1970-01-01
    相关资源
    最近更新 更多