polishsymfonycommunity / symfony-mocker-container
提供基本 Symfony 依赖注入容器,支持服务模拟。
v1.0.8
2024-09-09 16:50 UTC
Requires
- php: ^8.0
- mockery/mockery: ^1.3
- symfony/dependency-injection: ^4.3 || ^5.0 || ^6.0 || ^7.0
Requires (Dev)
- phpunit/phpunit: ^8.4
README
Mocker 容器允许您在 Symfony 依赖注入容器中模拟服务。这在功能测试和 Behat 场景中特别有用。
此包始终是一个黑客方法。为了更好的方法,请尝试 https://github.com/docteurklein/TestDoubleBundle。
如果您想使用 Behat 与 mock 容器一起使用,请尝试 Symfony2 Mocker 扩展。
警告
请注意,您只能使用 BrowserKitDriver(与 Symfony2 功能测试和 Symfony2Extension for Behat 一起使用)来模拟服务。您无法使用任何实际向您的应用程序发送 HTTP 请求的驱动程序来模拟服务。
安装
将 SymfonyMockerContainer 添加到您的 composer.json 中
{ "require": { "polishsymfonycommunity/symfony-mocker-container": "*" } }
在 app/AppKernel.php
中替换测试环境的基容器类:
<?php /** * @return string */ protected function getContainerBaseClass() { if ('test' == $this->environment) { return '\PSS\SymfonyMockerContainer\DependencyInjection\MockerContainer'; } return parent::getContainerBaseClass(); }
清除您的缓存。
在 Behat 步骤中使用
在容器上使用 mock()
方法来创建一个新的 Mock
<?php namespace PSS\Features\Context; use Behat\Behat\Context\BehatContext; use Behat\Symfony2Extension\Context\KernelAwareInterface; use Symfony\Component\HttpKernel\KernelInterface; class AcmeContext extends BehatContext implements KernelAwareInterface { /** * @var \Symfony\Component\HttpKernel\KernelInterface $kernel */ private $kernel = null; /** * @param \Symfony\Component\HttpKernel\KernelInterface $kernel * * @return null */ public function setKernel(KernelInterface $kernel) { $this->kernel = $kernel; } /** * @Given /^CRM API is available$/ * * @return null */ public function crmApiIsAvailable() { $this->kernel->getContainer() ->mock('crm.client', 'PSS\Crm\Client') ->shouldReceive('send') ->once() ->andReturn(true); } /** * @AfterScenario * * @return null */ public function verifyPendingExpectations() { \Mockery::close(); } }
一旦服务被模拟,容器将返回其模拟而不是实际服务。
在 Symfony 功能测试中使用
<?php namespace PSS\Bundle\AcmeBundle\Tests\Controller; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; class AcmeControllerTest extends WebTestCase { /** * @var \Symfony\Bundle\FrameworkBundle\Client $client */ private $client = null; public function setUp() { parent::setUp(); $this->client = static::createClient(); } public function tearDown() { foreach ($this->client->getContainer()->getMockedServices() as $id => $service) { $this->client->getContainer()->unmock($id); } \Mockery::close(); $this->client = null; parent::tearDown(); } public function testThatContactDetailsAreSubmittedToTheCrm() { $this->client->getContainer()->mock('crm.client', 'PSS\Crm\Client') ->shouldReceive('send') ->once() ->andReturn(true); // ... } }