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

Symfony : Mock LDAP Component in functional tests

我想对我的 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”进行功能测试呢? 我应该模拟代码的哪一部分以最大化测试效率ciency 和覆盖率?

一些附加信息:

欢迎任何建议。 谢谢

埃里克

关于 mockin 外部服务:您可以从原始服务扩展测试服务,并使其方法按您想要的方式运行。例如:

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

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

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

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