如何访问测试类Symfony2中的get方法


How to access get method in a Test Class Symfony2

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

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

您不需要使用容器来测试服务和其他类。您应该创建该类的一个新实例,并使用测试替身注入依赖项。

测试双打-由于您不想编写功能测试并使用真正的依赖项,因此您应该使用testdouble。例如,如果其中一个服务依赖项是EntityManager,则会发生一个新条目被插入数据库(或从数据库中删除),而这不是单元测试的目的(如果您正在编写功能测试,则需要检查此tho)。

这就是你应该如何处理这种测试:

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 Mocking函数。它更易于使用,并且具有更多嘲讽功能:https://github.com/danrevah/ShortifyPunit

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

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