gpt4 book ai didi

symfony - PHPUnit中模拟Symfony2的请求和 session

转载 作者:行者123 更新时间:2023-12-03 01:55:22 26 4
gpt4 key购买 nike

我有一个类需要 Symfony2 服务 @request_stack,它返回 Symfony\Component\HttpFoundation\RequestStack 的实例。我用它来检索 POST 和 GET 值。

我的类还使用 Request->getSession() 中的 Symfony\Component\HttpFoundation\Session 来获取当前 session 。

现在我的类有一个如下所示的方法:

class MyClass {
public function doSomething() {
//Get request from request stack.
$Request = $this->RequestStack->getCurrentRequest();

//Get a variable from request
$var = $Request->request->get('something');
//Processes $var into $someprocessedvar and lets say it's equal to 3.
//Set value to session.
$this->Request->getSession()->set('somevar', $someprocessedvar);
}
}

我需要能够:

  1. 模拟RequestStack
  2. RequestStack获取Request
  3. 请求获取 session

综上所述,如何测试 MyClass 是否成功设置 session 中的预期值?

最佳答案

并非所有代码都值得进行单元测试。通常这表明您的代码可以简化。当您对有些复杂的代码进行单元测试时,测试可能会成为一种负担,通常在这些情况下最好进行边缘到边缘测试的集成。在您的示例中也不清楚您的类如何获取 RequestStack 因此我假设它已被注入(inject) __construct 中。

话虽如此,以下是测试该代码的方法:

protected function setUp()
{
$this->requestStack = $this->getMock('Fully-qualified RequestStack namespace');

$this->SUT = new MyClass($this->requestStack);
}

/** @test */
public function it_should_store_value_in_the_session()
{
$value = 'test value';

$request = $this->getMock('Request');
$request->request = $this->getMock('ParameterBag');
$session = $this->getMock('Session');

$this->requestStack
->expects($this->atLeastOnce())
->method('getCurrentRequest')
->will($this->returnValue());

$request->request
->expects($this->atLeastOnce())
->method('get')
->with('something')
->will($this->returnValue($value));

$request
->expects($this->once())
->method('getSession')
->will($this->returnValue($session));

$session
->expects($this->once())
->method('set')
->with('somevar', $value);

$this->SUT->doSomething();
}

这应该为您提供一个起点,但要注意在测试中出现模拟墙,因为即使行为仍然正确,对实现细节的非常小的更改也可能导致测试失败,这是您想要避免的事情尽可能多,这样测试的维护成本就不会很高。

编辑:我对您的问题进行了更多思考,并意识到通常您可以将 session 作为依赖项注入(inject)。如果这在您的用例中是可能的,它将大大简化测试。

关于symfony - PHPUnit中模拟Symfony2的请求和 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23837007/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com