polishsymfonycommunity/symfony-mocker-container

提供基本 Symfony 依赖注入容器,支持服务模拟。

v1.0.8 2024-09-09 16:50 UTC

This package is auto-updated.

Last update: 2024-09-10 09:20:39 UTC


README

Build Status

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);

        // ...
    }
}