如何在Test Class Symfony2中访问get方法

时间:2015-03-23 10:42:46

标签: php unit-testing symfony get phpunit

我必须编写一个测试类来测试我的服务方法。在我的控制器中,我可以通过$service = $this->get('myService');访问该服务,我可以通过执行$service->someMethod();来访问我的方法。
现在我想编写一个测试类来测试一些服务方法,我试着像doc那样做:

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方法来调用我的服务方法

2 个答案:

答案 0 :(得分:4)

您无需使用容器即可测试服务和其他类。 您应该创建该类的新实例,并使用测试双精度注入依赖项。

测试双打 - 因为您不想编写功能测试并使用真正的依赖项,所以您应该使用test double。 例如,如果其中一个服务依赖项是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框架,而不是使用内置的PHPUnit模拟函数。它更容易使用,它具有更多的模拟功能: https://github.com/danrevah/ShortifyPunit

答案 1 :(得分:0)

要测试您的服务,您应该扩展KernelTestCase类。

class ServiceTest extends KernelTestCase
{
    private $service;

    /**
     * {@inheritDoc}
     */
    public function setUp()
    {
        self::bootKernel();
        $this->service = static::$kernel->getContainer()
            ->get('my_service')
        ;
    }
}