Symfony 2单元测试服务错误

Symfony 2单元测试服务错误,symfony,service,phpunit,symfony-2.1,web-crawler,Symfony,Service,Phpunit,Symfony 2.1,Web Crawler,我用Symfony 2和phpunit做了一些功能测试 但我在服务方面遇到了一些麻烦。 让我解释一下。 在运行测试期间,我想使用应用程序使用的一些服务。因此,我只需设置设置内核的设置函数: static::$kernel = static::createKernel(); static::$kernel->boot(); $this->objectFactory = static::$kernel->getContainer()->get('som

我用Symfony 2和phpunit做了一些功能测试

但我在服务方面遇到了一些麻烦。 让我解释一下。 在运行测试期间,我想使用应用程序使用的一些服务。因此,我只需设置设置内核的设置函数:

    static::$kernel = static::createKernel();
    static::$kernel->boot();
    $this->objectFactory = static::$kernel->getContainer()->get('some.application.objectfactory');
所以我有这个,在我的函数中,我需要使用一个返回对象的服务,所以我这样调用我的服务

$var = $this->objectFactory->getObject($id);
显然,在我的拆卸功能中,我只是:

    protected function tearDown()
{
    $this->client->restart();
    unset($this->client, $this->objectFactory);
}
因此,我的问题是,当我运行测试时,我收到以下消息:

Symfony\Component\DependencyInjection\Exception\InactiveScopeException:无法创建非活动范围(“请求”)的服务(“请求”)

我找不到解决这个问题的办法。 有人知道吗

我的Symfony版本是2.2.1,phpunit版本是3.7.19

如果有人能帮助我,我会很高兴的

如果我的英语不是很好,我很抱歉


编辑

也许它可以帮助某人,在我使用的服务中:

        $request = $this->container->get('request');
这似乎是它不起作用的原因,当我删除它时,它没有说错误,但它们仍然不起作用


编辑
@塞浦路斯人 根据我的要求,你已经更改了我的代码。 因此,我只需在我想要的函数中添加客户机(客户机web测试用例),然后在函数中添加以下内容:

if (isset($client)) {
        $request = $client->getRequest();
    } else {
        $request = $this->container->get('request');
    }
因此,在我调用服务的函数中,我只是这样:

    public function getObject($id)
{
    //Get the service from the kernel
    $service = static::$kernel->getContainer()->get('service');
    $object = $service->getObject($id, $this->client);
}
它像这样工作很好

@nifr 你的想法对我不起作用,但我认为你的想法没有错,只是对我来说不起作用


不过,谢谢你的帮助,我很高兴我现在可以工作了,我希望这篇文章可以帮助其他人

在phpUnit中没有可用的请求,只要你不构建一个

如果您想测试一个请求。这样创建它:

use Symfony\Component\HttpFoundation\Request; 

protected $request;

public function setUp()
{
    // ...
    $this->request = new Request();
    // ... modify your request acccording to your needs
}
并使用请求在服务中添加/调用setter

$service = $this->kernel->getContainer()->get('your_service')
$service->setRequest($this->request);

或者使用WebtestCase创建一个。请尝试从客户端而不是服务容器获取请求:

$request = $this->client->getRequest();
$kernel = $this->client->getKernel();
$container = $this->client->getContainer();
通过这种方式,您还可以获得内核和/或容器:

$request = $this->client->getRequest();
$kernel = $this->client->getKernel();
$container = $this->client->getContainer();

还有一个有用的提示:客户端的内核在两个请求之间重新启动。因此,例如,如果您将您的模拟传递给客户端的容器并执行一些请求,那么在下一个请求中(在第一个请求之后),容器将不包含您的模拟。

事实上,我已经用于功能测试。我的意思是,我需要使用它来从Web服务中提供值,以检查我的测试。我已经扩展了WebTestCase,这就是为什么我有一些客户,我会检查你的想法,以设置请求。你是说像这样吗?=>就像我在编辑中说的,对我来说不管用,但也没必要错谢谢你的帮助