功能测试 - 模拟服务不会保留在服务容器中

2024-06-28

我希望有人能够对我面临的这个问题有所启发。

[问题]

我在功能单元测试中模拟了doctrine.orm.default_entity_manager 服务。我将其注入客户端服务容器中,这样我就不必在功能测试过程中访问我的数据库。对于仅涉及 GET 请求的测试,我能够验证我正在测试的控制器是否正在使用我的模拟服务。

但是,如果我尝试使用带有表单提交的爬网程序执行 POST 请求,我的模拟服务将不会持续存在。在初始 GET 请求之后,客户端似乎只是在需要时再次注入doctrine.orm.default_entity_manager 服务,而不是我在客户端服务容器中设置的模拟版本。

总之,在 GET 请求期间,正在使用我的模拟服务,但在 POST 请求期间,正在使用 EntityManager5144076565ee8_546a8d27f194334ee012bfe64f629947b07e4919__CG__\Doctrine\ORM\EntityManager 。[参见下面的代码片段]

[问题]

可以按照我的要求做吗?我想让我的所有请求都使用我定义的模拟服务。我想要进行功能测试,但避免从数据库写入或读取。

[示例代码]

    // Mocks
    $entityRepository = $this
    ->getMockBuilder('Doctrine\ORM\EntityRepository')
    ->setMethods(array('findby'))->disableOriginalConstructor()
    ->getMock();

    $entityRepository->expects($this->any())->method('findBy')
    ->will($this->returnValue(array()));

    $em = $this->getMockBuilder('Doctrine\ORM\EntityManager')
    ->setMethods(
    array('getRepository', 'getClassMetadata', 'flush',
    'persist'))->disableOriginalConstructor()
    ->getMock();

    $em->expects($this->any())->method('flush')
    ->will($this->returnValue(FALSE));

    $em->expects($this->any())->method('persist')
    ->will($this->returnValue(FALSE));

    $em->expects($this->any())->method('getRepository')
    ->will($this->returnValue($entityRepository));

    $em->expects($this->any())->method('getClassMetadata')
    ->will($this->returnValue(new ClassMetadata("test")));

    // Create test client.
    $client = static::createClient();

    // Inject entity mock into service container.
    $client->getContainer()
    ->set('doctrine.orm.default_entity_manager', $em, 'container');

    // Define request
    $crawler = $client->request('GET', '/locations/types/add');

    // Verify a few things
    $form = $crawler->selectButton('submit')->form();
    $form['location_type[title]'] = "TEST TITLE";
    $form['location_type[description]'] = "TEST DESCP";

    $crawler = $client->submit($form);

这里的问题是内核在每个请求之后(期间)启动:

protected function doRequest($request)
{
    // avoid shutting down the Kernel if no request has been performed yet
    // WebTestCase::createClient() boots the Kernel but do not handle a request
    if ($this->hasPerformedRequest) {
        $this->kernel->shutdown();
    } else {
        $this->hasPerformedRequest = true;
    }

    if ($this->profiler) {
        $this->profiler = false;

        $this->kernel->boot();
        $this->kernel->getContainer()->get('profiler')->enable();
    }

https://github.com/symfony/symfony/blob/master/src/Symfony/Bundle/FrameworkBundle/Client.php https://github.com/symfony/symfony/blob/master/src/Symfony/Bundle/FrameworkBundle/Client.php

因此,您需要在每次请求后用您的模拟替换教义:

// Inject entity mock into service container.
$client->getContainer()
->set('doctrine.orm.default_entity_manager', $em, 'container');

// Define request
$crawler = $client->request('GET', '/locations/types/add'); 

// Inject entity mock into service container.
$client->getContainer()
->set('doctrine.orm.default_entity_manager', $em, 'container');

全局使用模拟的一种更简单的方法是覆盖 config_test.yml 中的学说设置

 orm:
        default_entity_manager:  Acme/MyBundle/Test/MockDoctrineEM

http://symfony.com/doc/master/reference/configuration/doctrine.html http://symfony.com/doc/master/reference/configuration/doctrine.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

功能测试 - 模拟服务不会保留在服务容器中 的相关文章

  • 我怎样才能让我的卷发在刮擦之前等待几秒钟?

    所以我试图从网站上抓取一些数据 有一些必须被删除的名字列表 发生的情况是 如果有 15 个名字需要被删除 其中只有 5 个名字被删除 当我检查原始站点时 他们也以类似的方式加载数据 第一次加载网站时 仅显示五个名字 重新加载时会显示 10
  • PHPUnit:当将类型作为第二个参数作为非字符串传递时,assertInstanceOf() 不起作用

    我需要检查变量是否是User type User是我的班级 user我的对象 this gt assertInstanceOf user User 这是行不通的 我有以下错误 use of undefined constant User a
  • 如何使用 AutofacContrib.NSubstitute 监视被测类

    我正在使用 NSpec 框架 AutofacContrib NSubstitute v3 3 2 0 NSubstitute v1 7 0 0 目前最新的是 1 8 2 的类库项目中运行单元测试 The 被测类实例是用AutoSubstit
  • whereHas 之后的 where 查询在 Laravel 5.4 中无法正常工作

    就我而言 我有channels与多对多关系的表类别 table 我想获取他们的频道类别包含像doing这样的动态值LIKE查询每个类别的标题 但我需要检查 a 的另一列channel通过 where 子句 这是一个channel结构 id
  • 如何使用 OOP 从另一个 .php 到另一个 .php 的类使用 $db?

    我是 OOP PHP 的新手 自从开始 Web 开发以来我一直在使用过程 API 所以我很难迁移到 OOP 假设我有这四个 php文件和结构如下 连接 db php
  • 获取symfony中复选框的值

    我想获取复选框的值 选中或未选中 但复选框未添加到表单类型中 这是一个例子
  • MySQL:删除包含特定参数且早于一天的行[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在使用 mysql 为我的网站创建一个登录系统 它在基于订阅的系统上运行 如果参数 premium 等于 1 DAY 如果它早于一
  • Karma 的基本目录位置

    使用 karma 时无法加载用于测试的模板装置 为了简化 去了 c 创建了一个 1 txt 文本文件 制作了一个简单的 karma 初始化文件 其中包含 basePath 开始业力使用 C gt karma start sample con
  • 为什么 Laravel 即使在本地环境也会重定向到 https?

    我正在开发 Laravel 5 5 版本 我有一个需要域才能执行的应用程序 这就是为什么 我在我的中添加了以下条目 etc hosts文件 以便我可以使用以下域打开我的应用程序仪表板 应用程序 dev or api application
  • 如何循环并访问多维且关联的数组中的各个元素? PHP,JSON 或 XML

    我正在通过 API zotero org 检索书目数据 它与底部的示例类似 只是更复杂 示例是键入的 我想检索一条或多条记录并在页面上显示某些值 例如 我想循环遍历每个顶级记录并以格式良好的引文打印数据 暂时忽略正确的围兜样式 假设我只想为
  • php登录会话登录变量

    我正在学习 php 并已报名参加课程 我的用户登录信息显示如下 我的问题是登录时是否必须在会话中选择我想要的所有字段 我不能只使用 选择电子邮件 并按此拉出所有行 或者我必须在登录时选择所有行吗 例如 将该 uid uid 用于该会话 它是
  • Magento 开源 2.3 - CSS 和 JS 未加载

    I installed Magento 2 3 successfully but when type http localhost Magento2 http localhost Magento2 I get a blank page li
  • 正则表达式多次匹配多行

    我有一个像这样的字符串 Name John Doe Age 23 Primary Language English Description This is a multiline description field that I want
  • 如何正确使用 Bearer 代币?

    我正在制作一个授权系统PHP 我遇到了传递 JWT 令牌的承载方案 我阅读了 RFC 6750 1 我有以下疑问 这如何提高安全性 成功授权和登录后 服务器在其主体中使用 JWT 令牌响应客户端 现在当客户端发出另一个请求时 我不清楚如何实
  • 如何向用户提供 Ajax POST 响应作为下载?

    我正在尝试在包含帐户信息的现有页面中包含 vCard 导出功能 丑陋的方法包括 1 向同一页面提交表单 处理它并重新渲染整个页面 或者 2 针对页面上的 iframe 进行 GET 我真的很想避免这两种情况 但我可能必须使用 2 来实现目标
  • 无法从 localhost/xampp 发送邮件

    无法连接到 mail google com 端口 587 上的邮件服务器 请验证您的 SMTP 和 smtp port 设置php ini or use ini set 我将 xampp php ini 和 sendmail ini 文件配
  • Laravel Factory:手动增量列

    对于以下工厂定义 该列order需要按顺序进行 已经有专栏了id即自动递增 第一行的order应该开始于1以及每个附加行的order应该是下一个数字 1 2 3 etc factory gt define App AliasCommand
  • POST 数据加密 - HTTPS 足够吗?

    考虑一个场景 其中用户身份验证 用户名和密码 由用户在页面的表单元素中输入 然后提交 POST 数据通过 HTTPS 发送到新页面 其中 php 代码将检查凭据 现在 如果黑客位于网络中 并说可以访问所有流量 那么在这种情况下应用程序层安全
  • 尝试加载 php_oci8.dll 时 PHP 启动时出现警告

    我正在使用 XAMPP 并尝试为 sql 配置 Oracle 连接 我取消了该行的注释extension php oci8 dll一开始出现错误 缺少oci dll 但后来我从Oracle网页下载了instantclient 我尝试过版本
  • PHP 中的金字塔星号

    请看我的代码 for row var row gt 1 row for j 0 j lt row j echo echo echo nbsp Output 但我需要输出如下 您可能想查看一些字符串函数

随机推荐

  • 如何在烧瓶模板中模拟“current_user”?

    我想嘲笑flask login s current user在模板渲染下 该函数返回当前登录的用户 现在我正在嘲笑AnnonymousUserMixin from flask login如果用户未经过身份验证 则默认返回该值 但这会导致各种
  • 一对多关系:使用 JPA 2.0 更新已删除的子项

    我有双向一对多关系 0 or 1 client 0 个或多个列表产品订单 应在两个实体上设置或取消设置该关系 在客户端 我想设置分配给客户端的产品订单列表 然后应将客户端设置 取消设置为自动选择的订单 在产品订单方面 我想设置分配订单的客户
  • 在 ConEMU 中显示 git 分支

    有没有办法在 ConEmu 中以视觉方式 背景或类似 在 git 中显示分支 Git 分支可以在普通的 cmd 或 Far Manager 提示符中可见 所有魔法都是通过特殊的 ANSI 序列完成的 必须选中 Inject ConEmuHk
  • 获取当前 IP 地址 Xamarin.Forms(跨平台)

    如何获取 Xamarin Forms 跨平台 的当前 IP 地址 WifiManager 我无法使用并且 WifiManager 不能包含吗 public string MyIp foreach IPAddress adress in Dn
  • 如何在UIViewController中设置parentViewController?

    UIViewController 的parentViewController 属性是只读的 但我正在嵌套自定义视图控制器并希望使用此属性 但是 由于它是只读的 并且我没有找到其他方法来设置此属性 我的问题是 如何do我设置的 显然 UINa
  • 我可以在我的应用程序中使用 Whatsapp 发送消息吗

    我想在我的应用程序中使用 Whatsapp 向其他手机发送消息 我在 Github 上看到过这个用于 Whatsapp 的公共 API here https github com venomous0x WhatsAPI 但我没有找到 iOS
  • 这是服务的实际用途吗?

    我需要运行一个在后台处理钩子的应用程序 问题是我必须以管理员身份在系统启动时自动启动它 我尝试使用 Windows 任务计划程序 但在某些系统上它不会以管理员身份启动程序 这会导致奇怪的行为 我从未编写过 Windows 服务 但这是否是创
  • 在 heatmap.2 中将行标签设置为斜体

    我正在尝试使用 R 函数将行标签设置为斜体heatmap 2 没有默认选项 我无法通过设置找到解决方法par font 3 例如 如何将行标签设置为斜体heatmap 2 set seed 123 data matrix sample 10
  • 有没有办法让两张纸保持同步?

    无法仅共享 Google 文档中的一张电子表格 因此 您必须共享整个电子表格 因此 我正在考虑编写一个脚本来同步两个工作表 每个工作表位于不同的电子表格中 我想使用一个函数来获取行作为数组来做到这一点 有更好的策略来做到这一点吗 实现此目的
  • 响应式图像对齐中心 bootstrap 3

    我使用 Bootstrap 3 制作目录 当在平板电脑上显示时 产品图像看起来很难看 因为它们的尺寸较小 500x500 并且在浏览器中的宽度为 767 像素 我想将图像放在屏幕中央 但由于某种原因我不能 谁来帮忙解决问题 有 center
  • 从辅助类将输出写入控制台

    我有一个运行帮助程序类的控制台命令 我想用以下命令编写输出 this gt info 从助手类到控制台 我的代码如下所示 App Http Console Commands SomeCommand php function handle H
  • 将 CSS 应用于括号(圆括号)中的段落中的单词

    各位 情况是这样的 中的话 span 元素来自资源键 括号内的 CSS 需要略有不同 例如 span Hello this a wonderful resource I mean it span 现在的要求是 我的意思是 应该比其他单词的字
  • 使用 SQL 函数在 ActiveRecord 中进行插入/更新

    我想在我的 Rails 应用程序中存储 IP 地址 v4 和 v6 我已经安装了MySQL 的扩展 http labs watchmouse com 2009 10 extending mysql 5 with ipv6 functions
  • 声明日期,然后添加下一个工作日

    我没有得到我需要的结果 我想做的就是声明我的日期 然后添加下一个工作日 IE CASHDATE 1 这有效 但我需要下一个工作日是 5 号 DECLARE CASHDATE DATETIME SET CASHDATE 2016 12 02
  • Shutil.copytree 没有文件

    我正在尝试使用shutil copytree shutil copytree SOURCE DIR TARGET DIR ignore None 此副本也文件在文件夹中 我只需要复制没有任何文件的文件夹 怎么做 您可以通过提供 忽略 功能来
  • 如何使用 Javascript Promise 按顺序执行 AJAX 调用

    我正在循环访问地图 我想使用每个地图值作为参数进行单独的 AJAX 调用 以获取一些数据并记录它 见下文 这是可行的 但我想让 AJAX 调用按照地图的顺序进行 因为每次调用都是异步的 所以看来我应该使用 Promise 来实现按顺序执行
  • 导航控制器工具栏不显示 UIBarButtonItem

    我在 Xcode 6 2 的属性检查器中使用 显示工具栏 复选框在导航控制器上添加 或显示 工具栏 Because 与导航控制器关联的自定义工具栏 只读 我在用着self navigationController setToolbarIte
  • Apple doc的GCD生产者-消费者解决方案错误?

    在 Apple 并发编程指南的 从线程迁移 部分中 有 改变生产者 消费者实施 http developer apple com library ios documentation General Conceptual Concurrenc
  • 如何在WPF中应用WS_EX_TRANSPARENT?

    我想制作一个启动画面 无法通过鼠标 UI 单击 选择 因此我如何申请 Win32 ExtendedWindowStyles WS EX TRANSPARENT 在 Windows 演示基础窗口上 在表格中我会这样做 https stacko
  • 功能测试 - 模拟服务不会保留在服务容器中

    我希望有人能够对我面临的这个问题有所启发 问题 我在功能单元测试中模拟了doctrine orm default entity manager 服务 我将其注入客户端服务容器中 这样我就不必在功能测试过程中访问我的数据库 对于仅涉及 GET