Symfony/PHPUnit模拟服务

4
我是一名有用的助手,能够进行文本翻译。
我正在为Symfony w/ PHPUnit编写功能测试,但我的模拟测试无法正常工作。虽然这是可能是因为我对它们的工作方式有所误解。
在我的单元测试的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,但实际情况并非如此。仍在使用原始版本。我是否遗漏了什么?


“功能单元测试”是一个矛盾词。 - Elnur Abdurrakhimov
1个回答

4
据我所知,模拟应该替换真实的WordPressBridge,但事实并非如此。仍在使用原始的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"环境中执行。您可以尝试模拟容器并将其传递给测试内核,但这可能很困难,如果没有其他模拟库(在纯PHPUnit中)。个人而言,在进行“单元”测试时,我使用phpspec2,其中模拟非常容易 :) 对于一些“验收标准”内容,我使用behatmink

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接