Unit testing symfony的PHPUnit模拟请求堆栈

Unit testing symfony的PHPUnit模拟请求堆栈,unit-testing,symfony,mocking,phpunit,Unit Testing,Symfony,Mocking,Phpunit,我不明白如何模拟这个:$requestStack->getCurrentRequest()->getContent() 有两种方法:getCurrentRequest()->getContent(),它返回一个json对象(POST响应) 我将symfony与RequestStack类一起使用 整个代码是 class MessageReceivedService { protected $message; public function __construct(RequestS

我不明白如何模拟这个:
$requestStack->getCurrentRequest()->getContent()

有两种方法:
getCurrentRequest()->getContent()
,它返回一个json对象(POST响应)

我将symfony与
RequestStack
类一起使用

整个代码是

class MessageReceivedService
{
    protected $message;

    public function __construct(RequestStack $requestStack)
    {
        $this->message = json_decode($requestStack->getCurrentRequest()->getContent());
    }

    public function getMessage()
    {
        return $this->message;
    }
}

非常感谢。

您实际上不必模拟
RequestStack
类,因为它基本上是一个容器

如果要使用
RequestStack
进行测试,可以执行以下操作:

<?php
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;

class MessageReceivedServiceTest extends \PHPUnit_Framework_TestCase
{
    public function test()
    {
        $request = new Request([], [], [], [], [], [], [], json_encode([
            'foo' => 'bar'
        ]));

        $requestStack = new RequestStack();
        $requestStack->push($request);

        // Do your tests
    }
}

谢谢,但是,通常在单元测试中,我们不必使用new Class(),不是吗?我通常只模拟我不能真正测试的东西(fast,这是单元测试的一个要求)。例如:数据库查询、网络请求或具有许多其他依赖项的类。对于像
RequestStack
这样的简单容器类,我只使用实际的类,因为它没有什么真正令人兴奋的作用。这是一件坏事,最好等到真正需要信息时再做。这样你就只会把时间花在真正需要做的事情上。谢谢@Sven的专业知识,所以对你来说我应该使用setter而不是constructor?如果我没有Api的json响应,这个服务中的方法就不能工作。谢谢在这种情况下,您可以创建一个方法
parseResponse
,该方法在执行任何其他方法之前被调用(在方法本身中),并缓存返回的值。谢谢,您能给我举个例子吗?如果我理解,我会创建一个方法,谁先在我服务的每个方法中调用?或者我必须创建事件系统?谢谢您正在传递$requestStack。保存它。只有在调用getMessage时才开始解码json。它基本上是将工作从构造函数转移到需要不再在构造函数中创建的信息的方法。如果不止一个地方需要这些信息,那么创建一个私有函数来返回数据(如果重新创建数据很昂贵,那么可能会存储数据)。