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 和覆盖率?
一些附加信息:
- 我没有专用的 LDAP 服务器进行测试(测试在 运行
Docker 通过 gitlab-ci)
- 我知道“不要嘲笑你不
自己的。
- 我读过很多 posts/articles 说“你应该嘲笑
LdapAdapter”,但我不知道如何实现这一点,也没有
找到任何例子。
欢迎任何建议。
谢谢
埃里克
关于 mockin 外部服务:您可以从原始服务扩展测试服务,并使其方法按您想要的方式运行。例如:
class TestService extends \Symfony\OrAnyOtherExternalService
{
public function getConnection()
{
return new Connection([]);
}
}
然后在您的 services_test.yaml 中将此服务的 class 更改为您的测试服务:
services:
Symfony\OrAnyOtherExternalService:
class: TestData\Services\TestService
这种方式在测试环境应用程序将使用 TestService 而不是原来的
我想对我的 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 和覆盖率?
一些附加信息:
- 我没有专用的 LDAP 服务器进行测试(测试在 运行 Docker 通过 gitlab-ci)
- 我知道“不要嘲笑你不 自己的。
- 我读过很多 posts/articles 说“你应该嘲笑 LdapAdapter”,但我不知道如何实现这一点,也没有 找到任何例子。
欢迎任何建议。 谢谢
埃里克
关于 mockin 外部服务:您可以从原始服务扩展测试服务,并使其方法按您想要的方式运行。例如:
class TestService extends \Symfony\OrAnyOtherExternalService
{
public function getConnection()
{
return new Connection([]);
}
}
然后在您的 services_test.yaml 中将此服务的 class 更改为您的测试服务:
services:
Symfony\OrAnyOtherExternalService:
class: TestData\Services\TestService
这种方式在测试环境应用程序将使用 TestService 而不是原来的