Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 功能测试-模拟服务不存在于服务容器中_Php_Unit Testing_Symfony_Doctrine_Mocking - Fatal编程技术网

Php 功能测试-模拟服务不存在于服务容器中

Php 功能测试-模拟服务不存在于服务容器中,php,unit-testing,symfony,doctrine,mocking,Php,Unit Testing,Symfony,Doctrine,Mocking,我希望有人能对我面临的这个问题有所了解 [问题] 我在功能单元测试中模拟了doctrine.orm.default\u entity\u manager服务。我将其注入到客户机服务容器中,以便在功能测试过程中不必访问数据库。对于只涉及GET请求的测试,我能够验证正在测试的控制器是否正在使用模拟服务 但是,如果我试图通过使用爬虫提交表单来执行POST请求,我的模拟服务将不会持久。在最初的GET请求之后,客户机似乎只是根据需要再次注入doctrine.orm.default_entity_manag

我希望有人能对我面临的这个问题有所了解

[问题] 我在功能单元测试中模拟了doctrine.orm.default\u entity\u manager服务。我将其注入到客户机服务容器中,以便在功能测试过程中不必访问数据库。对于只涉及GET请求的测试,我能够验证正在测试的控制器是否正在使用模拟服务

但是,如果我试图通过使用爬虫提交表单来执行POST请求,我的模拟服务将不会持久。在最初的GET请求之后,客户机似乎只是根据需要再次注入doctrine.orm.default_entity_manager服务,而不是我在客户机服务容器中设置的模拟版本

总之,在GET请求期间使用了我的模拟服务,但在请求后使用了EntityManager 51440765EE8_546a8d27f194334ee012bfe64f629947b07e4919_uuuCG_uu\Doctrine\ORM\EntityManager。 [请参阅下面的代码片段]

[问题] 能按我的要求做吗?我希望所有请求都使用我定义的模拟服务。我希望进行功能测试,但避免从数据库中写入或读取

[样本代码]
这里的问题是内核在每个请求之后(期间)启动:

protected function doRequest($request)
{
    // avoid shutting down the Kernel if no request has been performed yet
    // WebTestCase::createClient() boots the Kernel but do not handle a request
    if ($this->hasPerformedRequest) {
        $this->kernel->shutdown();
    } else {
        $this->hasPerformedRequest = true;
    }

    if ($this->profiler) {
        $this->profiler = false;

        $this->kernel->boot();
        $this->kernel->getContainer()->get('profiler')->enable();
    }

因此,您需要在每次请求后用模拟替换条令:

// Inject entity mock into service container.
$client->getContainer()
->set('doctrine.orm.default_entity_manager', $em, 'container');

// Define request
$crawler = $client->request('GET', '/locations/types/add'); 

// Inject entity mock into service container.
$client->getContainer()
->set('doctrine.orm.default_entity_manager', $em, 'container');
全局使用模拟的一个更简单的方法是覆盖config_test.yml中的条令设置

 orm:
        default_entity_manager:  Acme/MyBundle/Test/MockDoctrineEM

 orm:
        default_entity_manager:  Acme/MyBundle/Test/MockDoctrineEM