Symfony/PHPUnit 模拟服务

本教程将介绍Symfony/PHPUnit 模拟服务的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

Symfony/PHPUnit 模拟服务 教程 第1张

问题描述

我正在使用 PHPUnit 为 Symfony 编写功能测试,但我的模拟不起作用.不过,我可能误解了它们的工作原理.

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

...
// Create a stub
$stub = $this->getMockBuilder('ApiBundleUtilWordPressBridge')
 ->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: ApiBundleUtilWordPressBridge
  arguments: [@service_container]

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

推荐答案

据我了解,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: "ApiBundleUtilWordPressBridge"

在 app/config/config_test.yml

parameters:
 api.wp_bridge.class: "ApiBundleUtilTestWordPressBridge"

然后功能测试将使用 "ApiBundleUtilTestWordPressBridge" - 因为它是在 "test" 环境中执行的.

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

我个人使用 phpspec2 进行单元"测试,其中模拟很容易 🙂 和一些接受标准"" 我正在使用的东西 behat 和 貂

好了关于Symfony/PHPUnit 模拟服务的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。