嘲弄Twig_Environment

时间:2017-11-06 13:57:22

标签: php unit-testing mocking twig phpunit

我想为phpUnit模拟Twig_Environment所以在我的测试中我打电话:

   $twigMock=$this->getMockBuilder(\Twig_Environment::class)
                            ->disableOriginalConstructor()
                            ->getMock()
                            ->method('render')
                            ->willReturn('');

然后我有一个班级:

class SampleClass
{
    private $twig=null;

    public function __construct(\Twig_Environment $twig)
    {
      $this->twig=$twig;
    }

    public function foo($param)
    {
       if(param)
       {
          $content=$this->twig->render('some_template./html.twig');
       }
       // DO other stuff
    }
}

但是当我试着打电话给我的测试课时:

$campleClassInstance=new SampleClass($twigMock);

我收到以下错误:

  

TypeError:传递给\ SampleClass :: __ construct()的参数2必须是Twig_Environment的一个实例,给出PHPUnit_Framework_MockObject_Builder_InvocationMocker的实例,

你知道如何解决它吗?

2 个答案:

答案 0 :(得分:2)

您正在将变量设置为willReturn的返回值,该值不会返回原始模拟对象,而是返回PHPUnit内部使用的PHPUnit_Framework_MockObject_Builder_InvocationMocker对象。您不能将模拟和期望链接在一起以使其起作用。将你的模仿改为:

$twigMock=$this->getMockBuilder(\Twig_Environment::class)
                        ->disableOriginalConstructor()
                        ->getMock();

$twigMock->method('render')
         ->willReturn('');

答案 1 :(得分:2)

在symfony 4.4中,不能模拟Environment类:

将“ Twig \ TemplateWrapper”类声明为“最终”,无法对其进行模拟。