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

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

【问题讨论】:

标签: symfony controller phpunit


【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-26
      • 2021-07-21
      • 2011-09-09
      • 1970-01-01
      • 1970-01-01
      • 2012-07-16
      • 1970-01-01
      相关资源
      最近更新 更多