我是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
答案 0 :(得分:4)
你正试图嘲笑你想要测试的课程:
$this->testController =
$this->getMockBuilder('myBundle\Controller\IndexController')
->disableOriginalConstructor()
->getMock();
您实际上应该实例化您正在测试的类,并模拟或存根其协作者。
但是,在这种特定情况下,不要编写单元测试,而是编写功能测试。有writing functional tests in Symfony docs的章节可以帮助你。
您的控制器使用了许多框架类(不属于您的类),您也不应该嘲笑它们。这就是为什么功能测试在这种情况下更好的原因。另外,请确保从控制器中移出尽可能多的代码,这样您就可以正确地对该部分进行单元测试(并尽可能少地编写功能测试)。
在此期间阅读一些关于单元测试的书籍(按以下顺序):