PHPUnit Symfony测试用例错误

时间:2016-01-03 19:44:36

标签: php symfony phpunit

我是Symfony的新手,我写过小app现在必须添加单元测试,这是我的控制器:

<?php
namespace myBundle\Controller;

use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\RedirectResponse;

class IndexController extends AbstractController
{

    /**
     * @param \Symfony\Component\HttpFoundation\Request $request
     * @return \Symfony\Component\HttpFoundation\Response
     */
    public function indexAction(Request $request)
    {

        if ($this->getRequest()->isMethod('POST')) {
            // Do Something
        }

        // Do Something otherwise
    }
}

我的测试:

class IndexControllerTest extends \PHPUnit_Framework_TestCase
{
    protected $testController;

    public function setUp()
    {

        $this->testController =
            $this->getMockBuilder('myBundle\Controller\IndexController')
                ->disableOriginalConstructor()
                ->getMock();

    }

    public function testPostSaveActionWithBadRequest()
    {
        $expectation = 'Some text ';

        $response = $this->testController->indexAction(new Request);
        $this->assertInstanceOf(
            'Symfony\Component\HttpFoundation\JsonResponse',
            $response
        );
        $content = json_decode($response->getContent());
        $this->assertEquals($expectation, $content->error);
    }

}

当我运行此测试时,我得到以下信息:

  

PHP致命错误:调用成员函数get()

基本上在以下一行

  

if($ this-&gt; getRequest() - &gt; isMethod('POST')){

这告诉我容器为空(我通过打印容器的转储来验证它)。

任何想法我在这里缺少什么,或者有没有办法提供容器作为该测试的依赖。

我非常感谢所有的帮助。

感谢 FI

1 个答案:

答案 0 :(得分:4)

你正试图嘲笑你想要测试的课程:

$this->testController =
    $this->getMockBuilder('myBundle\Controller\IndexController')
        ->disableOriginalConstructor()
        ->getMock();

您实际上应该实例化您正在测试的类,并模拟或存根其协作者。

但是,在这种特定情况下,不要编写单元测试,而是编写功能测试。有writing functional tests in Symfony docs的章节可以帮助你。

您的控制器使用了许多框架类(不属于您的类),您也不应该嘲笑它们。这就是为什么功能测试在这种情况下更好的原因。另外,请确保从控制器中移出尽可能多的代码,这样您就可以正确地对该部分进行单元测试(并尽可能少地编写功能测试)。

在此期间阅读一些关于单元测试的书籍(按以下顺序):