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 组件的主要内容,如果未能解决你的问题,请参考以下文章