首页 文章

单元测试时出现Symfony 2服务错误

提问于
浏览
1

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

但我在使用服务时遇到了一些麻烦 . 让我解释 . 在我的运行测试期间,我想使用应用程序使用的一些服务 . 所以我juste设置我的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

如果有人可以帮助我,我会非常高兴 .

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


编辑

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

$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你的想法对我不起作用,但我认为你的想法没有错,它们只是不适用于我的情况

但是感谢您的帮助,我很高兴我现在工作,我希望这篇文章可以帮助别人

2 回答

  • 0

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

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

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

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

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

  • 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 .

相关问题