如何用phpunit测试Symphony中的控制器方法?

时间:2019-02-14 15:27:47

标签: symfony controller phpunit

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

2 个答案:

答案 0 :(得分:0)

单元测试

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

想象一下以下控制器:

/**
 * @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,因为在大多数情况下它们需要有效的数据。看看DoctrineFixturesBundle here

答案 1 :(得分:-1)

像此示例一样首先进行路由

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

您可以测试它,只需使用路由变量打开localhost

localhost:8000 /订单