4

我正在用 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]

我的理解是 mock 应该取代 real WordPressBridge,但这不是正在发生的事情。我原来的还在用。我错过了什么吗?

4

1 回答 1

4

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

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

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

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”环境中执行的。

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

就我个人而言,我使用phpspec2进行“单元”测试,其中模拟很容易:) 并且对于一些“验收标准”的东西,我使用behatmink

于 2013-02-24T19:19:47.660 回答