如何使用 phpunit 在 Symfony 中测试控制器方法?

Posted

技术标签:

【中文标题】如何使用 phpunit 在 Symfony 中测试控制器方法?【英文标题】:How to test controller method in Symfony with phpunit? 【发布时间】:2019-07-08 16:23:22 【问题描述】:

我现在正在开发我的应用程序,我想集成单元测试。如果可能的话,我想测试已经在我的应用程序中编写的控制器方法

【问题讨论】:

阅读文档非常简单:symfony.com/doc/current/testing.html#functional-tests 当你测试一个控制器时,它被称为功能测试,当它是一个函数时,它是一个单元测试 【参考方案1】:

像这个例子一样先做路由

    /**
     * @Route("/order", name="order_display")
     */
public function displayAction()

你可以用路由变量打开本地主机来测试它

本地主机:8000/订单

【讨论】:

您能否进一步解释一下如何使用 phpUnit?【参考方案2】:

单元测试

您可以像对任何其他类的方法进行单元测试一样对控制器进行单元测试。

想象以下控制器:

/**
 * @Route("/foo")
 */
class FooController extends AbstractController

    /**
     * @var SomeDependency 
     */
    private $someDependency;

    public function __construct(SomeDependency $someDependency)
    
        $this->someDependency = $someDependency;
    

    /**
     * @Route("/bar/id", name="foo_bar")
     */
    public function bar($id)
    
        $result = $this->someDependency->someMethod($id)
        if (null === $result) 
            return new Response('Error', Response::HTTP_NOT_FOUND);
        
        return new Response($result, Response::HTTP_OK);
    

对于本示例,您可以编写以下单元测试(将 Mockery 替换为任何其他模拟框架):

public function testFooBar()

    // Mock dependencies
    $mockDependency = \Mockery::mock(SomeDependency::class);
    $mockDependency
        ->shouldReceive('someMethod')
        ->andReturn('Some result');
    // Create controller
    $fooController = new FooController($mockDependency);

    // Act
    $response = $fooController->bar(1);

    // Assert
    $this->assertEquals(200, $response->getStatusCode());

集成测试/功能测试

按照here 的描述使用WebTestCase

class FooControllerTest extends WebTestCase

    public function testFooBar()
    
        $client = static::createClient();

        $client->request('GET', '/foo/bar/1');

        $this->assertEquals(200, $client->getResponse()->getStatusCode());
    

您可能希望在执行这些测试之前加载一些Fixtures,因为它们在大多数情况下都需要有效数据。看看DoctrineFixturesBundlehere。

【讨论】:

【参考方案3】:

从您的类控制器创建一个新对象并调用您的方法。 测试后返回。

例如

use App\Controller\DocumentController;
use PHPUnit\Framework\TestCase;

class ScrapTest extends TestCase

    public function testSomething(): void
    
  $Document = new DocumentController();
  $ret=$Document->myMethod();
  $this->assertEquals('test',$ret);

你可以阅读这个解释 symfony-cast

【讨论】:

以上是关于如何使用 phpunit 在 Symfony 中测试控制器方法?的主要内容,如果未能解决你的问题,请参考以下文章

Symfony:如何正确地从phpunit / phpunit切换到phpunit桥

Symfony/PhpUnit - 如何测试服务中是不是抛出异常

Symfony 3模拟服务功能测试phpunit和liip

如何在 symfony phpunit kernelTestCase 中正确注入 monolog.logger / LoggerInterface 作为模拟

Symfony 5 Phpunit 未定义方法

应该将 phpunit 或石灰与 symfony 一起使用吗? [关闭]