我需要一些帮助我想写一个关于控制器方法的单元测试,我搜索了一些示例并测试了很多方法,但没有一个方法有效:
这是我的控制器:
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时,我有这个警告“试图配置方法”渲染“无法配置,因为它不存在,尚未指定,是最终的,或者是静态的”
如果有人对此有所了解,我会很感激
答案 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>