Symfony / PHPUnit模拟服务

时间:2013-02-24 18:22:28

标签: php symfony phpunit

我正在为使用PHPUnit的Symfony编写功能测试,我的模拟效果不佳。我有可能误解了它们是如何工作的。

在我的单元测试的setUp()方法中,我有这段代码:

...
// Create a stub
$stub = $this->getMockBuilder('\\ApiBundle\\Util\\WordPressBridge')
    ->disableOriginalConstructor()
    ->getMock();

// Configure the stub.
$user = new WordPressUser();
$user->setUsername('dummy');
$stub->expects($this->any())
     ->method('checkCredentials')
     ->will($this->returnValue(true));
$stub->expects($this->any())
     ->method('getUser')
     ->will($this->returnValue($user));
...

在我的Symfony应用程序中,我定义了一个服务:

services:
    api.wp_bridge:
        class: ApiBundle\Util\WordPressBridge
        arguments: [@service_container]

我的理解是模拟应该替换真实的WordPressBridge,但这不是正在发生的事情。我原来还在使用。我错过了什么吗?

1 个答案:

答案 0 :(得分:3)

  

我的理解是模拟应该替换真正的WordPressBridge,但这不是正在发生的事情。我原来还在使用。我错过了什么吗?

基本上你必须在Symfony容器中以某种方式替换你的服务。

如果您正在进行“功能测试”,那么您可能应该为“test” env创建测试“虚拟”服务,这将覆盖原始服务。你可以这样做:

src / YourBundle / Resources / config / services.yml

services:
    api.wp_bridge:
        class: %api.wp_bridge.class%
        arguments: [@service_container]

app / config / config.yml

parameters:
    api.wp_bridge.class: "ApiBundle\Util\WordPressBridge"

app / config / config_test.yml

parameters:
    api.wp_bridge.class: "ApiBundle\Util\TestWordPressBridge"

然后功能测试将使用“ApiBundle \ Util \ TestWordPressBridge” - 因为它在“test”中执行 env。

您可以尝试模拟容器并将其传递给测试内核,但如果没有其他一些模拟库(在纯PHPUnit中),这可能会很痛苦。

我个人使用phpspec2进行“单元”测试,其中模拟很简单:)以及我使用的behatmink

的一些“验收标准”内容