如何在测试中访问 get 方法 Class Symfony2
How to access get method in a Test Class Symfony2
我必须编写一个测试 class 来测试我的服务方法。在我的控制器中,我可以通过 $service = $this->get('myService');
访问服务,并且可以通过 $service->someMethod();
访问我的方法。
现在我想写一个测试 class 来测试一些服务方法,我试着像文档那样做:
class ServiceTest extends \PHPUnit_Framework_TestCase {
public function testSomeMethod() {
$service = $this->get('myService');
....
}
}
当我启动测试时,我得到类似的东西:
Fatal error : Call to undefined method XXX\XXXBundle\Tests\Services\ServicesTest::get() in ...
所以我的问题是如何使用 get 方法调用我的服务方法
要测试您的服务,您应该扩展 KernelTestCase
class。
class ServiceTest extends KernelTestCase
{
private $service;
/**
* {@inheritDoc}
*/
public function setUp()
{
self::bootKernel();
$this->service = static::$kernel->getContainer()
->get('my_service')
;
}
}
您不需要使用容器 来测试服务和其他 classes。
您应该创建 class 的新实例并使用测试替身注入依赖项。
测试双打
- 由于您不想编写功能测试并使用真正的依赖项,因此您应该使用测试替身。
例如,如果服务依赖项之一是 EntityManager
将会发生的事情是将新条目插入数据库(或从中删除)并且它不是单元测试的目的(你需要检查这个如果您正在编写功能测试)。
这就是您应对此类测试的方式:
public function testSomeServiceAdd()
{
$dependencyOne = $this->getMockBuilder('Acme\SomeBundle\DependencyOne')->
disableOriginalConstructor()->
getMock();
$dependencyTwo = $this->getMockBuilder('Acme\SomeBundle\DependencyTwo')->
disableOriginalConstructor()->
getMock();
$service = new SomeService($dependencyOne, $dependencyTwo);
$response = $service->add(1, 2);
$this->assertEquals($response, 3);
}
如您所见,我是 "mocking" 依赖项并将其注入到服务中,之后我调用该方法并断言结果。
我还想推荐一个 Mocking 框架,而不是使用内置的 PHPUnit 模拟函数。它更易于使用,并且具有更多模拟功能:
https://github.com/danrevah/ShortifyPunit
我必须编写一个测试 class 来测试我的服务方法。在我的控制器中,我可以通过 $service = $this->get('myService');
访问服务,并且可以通过 $service->someMethod();
访问我的方法。
现在我想写一个测试 class 来测试一些服务方法,我试着像文档那样做:
class ServiceTest extends \PHPUnit_Framework_TestCase {
public function testSomeMethod() {
$service = $this->get('myService');
....
}
}
当我启动测试时,我得到类似的东西:
Fatal error : Call to undefined method XXX\XXXBundle\Tests\Services\ServicesTest::get() in ...
所以我的问题是如何使用 get 方法调用我的服务方法
要测试您的服务,您应该扩展 KernelTestCase
class。
class ServiceTest extends KernelTestCase
{
private $service;
/**
* {@inheritDoc}
*/
public function setUp()
{
self::bootKernel();
$this->service = static::$kernel->getContainer()
->get('my_service')
;
}
}
您不需要使用容器 来测试服务和其他 classes。 您应该创建 class 的新实例并使用测试替身注入依赖项。
测试双打
- 由于您不想编写功能测试并使用真正的依赖项,因此您应该使用测试替身。
例如,如果服务依赖项之一是 EntityManager
将会发生的事情是将新条目插入数据库(或从中删除)并且它不是单元测试的目的(你需要检查这个如果您正在编写功能测试)。
这就是您应对此类测试的方式:
public function testSomeServiceAdd()
{
$dependencyOne = $this->getMockBuilder('Acme\SomeBundle\DependencyOne')->
disableOriginalConstructor()->
getMock();
$dependencyTwo = $this->getMockBuilder('Acme\SomeBundle\DependencyTwo')->
disableOriginalConstructor()->
getMock();
$service = new SomeService($dependencyOne, $dependencyTwo);
$response = $service->add(1, 2);
$this->assertEquals($response, 3);
}
如您所见,我是 "mocking" 依赖项并将其注入到服务中,之后我调用该方法并断言结果。
我还想推荐一个 Mocking 框架,而不是使用内置的 PHPUnit 模拟函数。它更易于使用,并且具有更多模拟功能: https://github.com/danrevah/ShortifyPunit