1

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

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

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

这似乎是它不起作用的原因,当我删除它时,它没有说错误,但它们仍然不起作用。


编辑
@Cyprian 根据你已经改变了我想要的代码。所以我只是添加到我的服务中,在我想要的函数中,客户端(客户端 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您的想法对我不起作用,但我认为您的想法没有错,它们只是不适用于我的情况

但是感谢您的帮助,我很高兴我现在可以工作,并且我希望该帖子可以对其他人有所帮助

4

2 回答 2

0

只要您不构造请求,phpUnit 中就没有可用的请求。

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

use Symfony\Component\HttpFoundation\Request; 

protected $request;

public function setUp()
{
    // ...
    $this->request = new Request();
    // ... modify your request acccording to your needs
}

并使用请求在您的服务中添加/调用设置器。

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

或使用 WebtestCase创建功能测试。

于 2013-05-28T16:16:15.410 回答
0

尝试从客户端获取请求,而不是服务容器:

$request = $this->client->getRequest();

通过这种方式,您还可以获得内核和/或容器:

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

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

于 2013-05-28T21:37:59.030 回答