Symfony 2单元测试服务错误
我用Symfony 2和phpunit做了一些功能测试 但我在服务方面遇到了一些麻烦。 让我解释一下。 在运行测试期间,我想使用应用程序使用的一些服务。因此,我只需设置设置内核的设置函数: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
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,这就是为什么我有一些客户,我会检查你的想法,以设置请求。你是说像这样吗?=>就像我在编辑中说的,对我来说不管用,但也没必要错谢谢你的帮助