symfony中的测试控制器方法(phpUnit)

时间:2017-05-25 11:30:50

标签: symfony phpunit

我需要一些帮助我想写一个关于控制器方法的单元测试,我搜索了一些示例并测试了很多方法,但没有一个方法有效:

这是我的控制器:

class ComputerController extends Controller
{
/**
     * @Route("/list-computers.html", name="back_computer_list")
     * @return RedirectResponse|Response
     */
    function listComputerAction()
    {
        $ad = $this->get("ldap_service");
        $computers = $ad->getAllComputer();
        return $this->render('BackBundle:Computer:list.html.twig', array(
            "computers" => $computers,
        ));
    }

我试图用这样的模拟测试它:

class ComputerController extends Controller
{
    /**
     * @var EngineInterface
     */
    private $templating;


    public function setTemplating($templating)
    {
        $this->templating = $templating;
    }
and i have created a test method:

class ComputerControllerTest extends  TestCase {

    public function testlistComputerAction(){
        $templating = $this->getMockBuilder('BackBundle\Controller\ComputerController')->getMock();
        $computers = [1,2];
        $templating->expects($this->once())
            ->method('render')
            ->with('BackBundle:Computer:list.html.twig', array(
                "computers" => $computers))
            ->will($this->returnValue( $computers));

        $controller = new ComputerController();
        $controller->setTemplating($templating);

        $this->assertEquals('success', $controller->listComputerAction());
    }

当我开始执行phpunit时,我有这个警告“试图配置方法”渲染“无法配置,因为它不存在,尚未指定,是最终的,或者是静态的”

如果有人对此有所了解,我会很感激

2 个答案:

答案 0 :(得分:1)

我尝试在ldapService中测试一个方法:这是我要测试的服务的方法

/**
     * @return bool|resource
     */
    public function getLdapBind()
    {
        if (!$this->ldapBind) {

            if ($this->getLdapConnect()) {
                $this->ldapBind = @ldap_bind($this->ldapConnect, $this->ldapUser, $this->ldapPass);
            }
        }
        return $this->ldapBind;

    }


    /**
     * @param $ldapUser
     * @param $password
     * @return bool
     */
    function isAuthorized($ldapUser, $password)
    {
        $result = false;
        if ($this->ldapConnect) {
            $result = @ldap_bind($this->ldapConnect, $ldapUser, $password);
        }
        return $result;
    }

这是测试(使用Mock):

<?php

namespace BackBundle\Tests\Service;

use PHPUnit\Framework\TestCase;
use BackBundle\Service\LdapService;
use PHPUnit_Framework_MockObject_InvocationMocker;

class LdapServiceTest extends  TestCase {



  public function testgetLdapConnect()
    {
//        $LdapService = new LdapService();
        $ldapMock = $this->getMockBuilder( 'LdapService')->setMethods(['getLdapBind'])->disableOriginalConstructor()->getMock();
        $ldapMock->expects($this->once())
//                ->method()
                ->with(array('ldap_bind', 'mike', 'password'))
            ->will($this->returnValue(true));

        $ldapMock->isAuthorized('mike', 'password');
    }
}

但我有一个警告,我无法解决:“方法名称匹配器未定义,无法定义参数匹配器”

如果有人,请对此有所了解

答案 1 :(得分:0)

老实说,在那个三线控制器上测试没什么用处。 #1是服务容器,#3是Twig子系统。第2行可以在它上面进行单元测试。

对于更复杂的控制器,我发现将它们作为一个服务,其中所有依赖项都通过构造函数传递,或者进入操作本身确实使得稍微复杂的控制器非常容易,但是很少需要它。 / p>