我使用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);
显然在我的tearDown函数中我只是:
protected function tearDown()
{
$this->client->restart();
unset($this->client, $this->objectFactory);
}
所以我的问题是当我运行测试时我会收到这条消息:
Symfony \ Component \ DependencyInjection \ Exception \ InactiveScopeException:您无法创建非活动范围的服务(“请求”)(“请求”)。
我无法找到解决这个问题的方法。 有人有任何想法??
我的Symfony版本是2.2.1,我的phpunit版本是3.7.19
如果有人可以帮助我,我会非常高兴。
如果我的英语不太好,我很抱歉。
<小时/> EDIT
$request = $this->container->get('request');
这似乎是它不起作用的原因,当我删除它时,它没有说错误,但它们仍然不起作用。
<小时/> EDIT
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 你的想法对我不起作用,但我认为你的想法没有错,它们在我的案例中不起作用
但是感谢您的帮助,我很高兴我现在工作,我希望这篇文章可以帮助其他人
答案 0 :(得分:0)
只要你没有构建一个请求,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创建Functional Test。
答案 1 :(得分:0)
尝试从客户端获取请求,而不是服务容器:
$request = $this->client->getRequest();
通过这种方式,您还可以获得内核和/或容器:
$kernel = $this->client->getKernel();
$container = $this->client->getContainer();
一个更有用的提示:来自客户端的内核在每两个请求之间重新启动。因此,例如,如果您将模拟传递给客户端的容器并执行某些请求,则在下一个请求中(在第一个请求之后),容器将不包含您的模拟。