【发布时间】:2019-07-08 16:23:22
【问题描述】:
我现在正在开发我的应用程序,我想集成单元测试。如果可能的话,我想测试已经在我的应用程序中编写的控制器方法
【问题讨论】:
-
当你测试一个控制器时,它被称为功能测试,当它是一个函数时,它是一个单元测试
标签: symfony controller phpunit
我现在正在开发我的应用程序,我想集成单元测试。如果可能的话,我想测试已经在我的应用程序中编写的控制器方法
【问题讨论】:
标签: symfony controller phpunit
像这个例子一样先做路由
/**
* @Route("/order", name="order_display")
*/
public function displayAction()
你可以用路由变量打开本地主机来测试它
本地主机:8000/订单
【讨论】:
您可以像对任何其他类的方法进行单元测试一样对控制器进行单元测试。
想象以下控制器:
/**
* @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。
【讨论】:
从您的类控制器创建一个新对象并调用您的方法。 测试后返回。
例如
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
【讨论】: