【问题标题】:How to access get method in a Test Class Symfony2如何在测试类 Symfony2 中访问 get 方法
【发布时间】:2015-03-23 10:42:46
【问题描述】:

我必须编写一个测试类来测试我的服务方法。在我的控制器中,我可以通过$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 方法来调用我的服务方法

【问题讨论】:

  • 看看我的回答,它是对服务方法进行单元测试的正确方法。

标签: php unit-testing symfony get phpunit


【解决方案1】:

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

测试替身 - 因为您不想编写功能测试并使用真正的依赖项,所以您应该使用测试替身。 例如,如果服务依赖项之一是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

【讨论】:

  • 我误解了这个问题,所以我把它删除了。在我再次阅读 OP 问题后,旅游答案是一个很好的答案
【解决方案2】:

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

class ServiceTest extends KernelTestCase
{
    private $service;

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

【讨论】:

  • 谢谢@AlexandruOlaru,我一开始测试了它,但现在好像我做错了什么,现在它工作得很好。非常感谢
猜你喜欢
  • 1970-01-01
  • 2015-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多