【问题标题】:Symfony/PHPUnit mock servicesSymfony/PHPUnit 模拟服务
【发布时间】:2013-02-09 21:19:20
【问题描述】:

我正在使用 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,但事实并非如此。我原来的还在用。我错过了什么吗?

【问题讨论】:

  • “功能单元测试”是矛盾的。

标签: php symfony phpunit


【解决方案1】:

据我了解,mock 应该替换真正的 WordPressBridge,但事实并非如此。我原来的还在用。我错过了什么吗?

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    • 2015-07-24
    • 2019-04-13
    相关资源
    最近更新 更多