我正在为使用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
,但这不是正在发生的事情。我原来还在使用。我错过了什么吗?
答案 0 :(得分:3)
我的理解是模拟应该替换真正的WordPressBridge,但这不是正在发生的事情。我原来还在使用。我错过了什么吗?
基本上你必须在Symfony容器中以某种方式替换你的服务。
如果您正在进行“功能测试”,那么您可能应该为“test” env创建测试“虚拟”服务,这将覆盖原始服务。你可以这样做:
src / YourBundle / Resources / config / services.ymlservices:
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中),这可能会很痛苦。
的一些“验收标准”内容