Laravel 4 控制器测试 - 太多 $this->call() 后出现 ErrorException - 为什么?

2024-01-08

我非常感谢有关我遇到的 Laravel 4 问题的帮助。

我正在测试控制器路由,特别是负责路由调查问卷响应的控制器。我正在测试以下场景:用户尝试跳过问题、用户请求不存在的问题......等等。

到目前为止,我为所有场景编写的测试都可以使用 PHPunit 按预期工作。我目前正在编写的测试涉及几个$this->call() or $this->client->request()处决,这就是事情崩溃的地方。如果我执行$this->call() or $this->client->request()在单个测试方法中多次(具体为 2 次或更多次)我在终端中收到 ErrorException:

{“错误”:{“类型”:“ErrorException”,“消息”:“未定义的变量:标头”,“文件”:“/Volumes/Dev HD/dmh/app/views/layouts/steps.php”,“行":1}}

如果我减少数量$this->call() or $this->client->request()在测试方法一中,一切正常,并且没有显示异常。我一直在使用以下代码:

Code

/**
 * When the user skips questions they have not yet answered, the user 
 * should be redirected back to the first unanswered question.
 *
 * @return void
 */
public function testDiscoverSkipQuestions()
{
    // Get the first question.
    $domCrawler = $this->client->request('GET', 'style/discover');

    // Answer the first question
    $form = $domCrawler->selectButton("Next »")->form();
    $form['question_1'] = 'A:0';
    $response = $this->client->submit($form);
    $this->assertRedirectedTo('style/discover/2');

    // Get the 5th question.
    $this->call('GET', 'style/discover/5');
    // BROKEN

    // Expect to be redirected to the 2nd question.
    $this->assertRedirectedTo('style/discover/2');
    $this->assertSessionHas('attention');
}

有任何想法吗?

我是否需要重置某些内容才能拨打多个电话?像这样拨打多个电话是不好的做法吗?有没有更好的方法来编写这个测试?任何想法将不胜感激。

非常感谢!


可能的解决方案:

Use $this->client->restart()开始一个新的请求。

解释/详细信息:

好吧,这就是兔子洞:D

  1. Laravel TestCase延伸照明\基础\测试\测试用例 https://github.com/laravel/framework/blob/master/src/Illuminate/Foundation/Testing/TestCase.php
  2. 照明\基础\测试\测试用例 https://github.com/laravel/framework/blob/master/src/Illuminate/Foundation/Testing/TestCase.php uses 照明\基础\测试\客户端 https://github.com/laravel/framework/blob/master/src/Illuminate/Foundation/Testing/Client.php提出虚假请求。
  3. 照明\基础\测试\客户端 https://github.com/laravel/framework/blob/master/src/Illuminate/Foundation/Testing/Client.php延伸Symfony\Component\HttpKernel\Client https://github.com/symfony/symfony/blob/master/src/Symfony/Component/HttpKernel/Client.php
  4. Symfony\Component\HttpKernel\Client https://github.com/symfony/symfony/blob/master/src/Symfony/Component/HttpKernel/Client.php扩展抽象类Symfony\Component\BrowserKit\ 客户端 https://github.com/symfony/symfony/blob/master/src/Symfony/Component/BrowserKit/Client.php
  5. 抽象类Symfony\Component\BrowserKit\ 客户端 https://github.com/symfony/symfony/blob/master/src/Symfony/Component/BrowserKit/Client.php有一个方法重新开始() https://github.com/symfony/symfony/blob/master/src/Symfony/Component/BrowserKit/Client.php#L511

所以,我相信你的情况(我没有亲自测试过),你应该能够执行以下操作:

/**
 * When the user skips questions they have not yet answered, the user 
 * should be redirected back to the first unanswered question.
 *
 * @return void
 */
public function testDiscoverSkipQuestions()
{
    // Get the first question.
    $domCrawler = $this->client->request('GET', 'style/discover');

    // Answer the first question
    $form = $domCrawler->selectButton("Next »")->form();
    $form['question_1'] = 'A:0';
    $response = $this->client->submit($form);
    $this->assertRedirectedTo('style/discover/2');

    // ******** Restart for new request ********
    $this->client->restart();

    // Get the 5th question.
    $this->call('GET', 'style/discover/5');
    // ******** SHOULD NOW WORK - call() is a proxy to $this->client->request(); ********

    // Expect to be redirected to the 2nd question.
    $this->assertRedirectedTo('style/discover/2');
    $this->assertSessionHas('attention');
}

Notecall() 方法是使用代理$this->client->request() https://github.com/laravel/framework/blob/master/src/Illuminate/Foundation/Testing/TestCase.php#L56

希望有帮助!不要害怕深入研究代码继承,看看是否存在一种方便的方法来完成您需要的操作 - 更改通常已经存在:D

改进(?)

请注意,这些测试可能更倾向于“集成测试”而不是“单元测试”。与持续集成框架一起使用时,集成测试可能更适合。看这个问题 https://stackoverflow.com/questions/6511337/how-to-perform-integration-testing-in-php了解更多信息。

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

Laravel 4 控制器测试 - 太多 $this->call() 后出现 ErrorException - 为什么? 的相关文章

  • 在 Laravel 中按数据透视表 create_at 排序

    在我的数据库中 我有以下表格 courses id 名称 创建时间 更新时间 students id 名称 创建时间 更新时间 课程 学生 id course id student id created at updated at 我正在尝
  • PHPunit - 错误

    当 PHPunit 框架不希望发生的错误发生时 测试会停止 PHP 会抛出错误 但 PHPunit 不会记录这是一个错误 我如何确保 PHPunit 将其记录为错误 免责声明 我是 PHPUnit 的新手 我也试图弄清楚 发生错误时会发生什
  • cURL 错误 77:设置证书验证位置时出错:CAfile

    我正在使用 Firebase php SDKlink https firebase php readthedocs io en latest index html并在 Windows 10 上的 XAMPP 服务器上使用 laravel 最
  • Laravel 路由中的“as”关键字是什么意思?

    据我从 Laravel 文档中了解到 它用于重定向 但也许我错了 I wrote Route get user profile as gt profile function echo some text 然后我期望我的 URL 重定向自ht
  • @RestController 没有 @ResponseBody 方法工作不正确

    我有以下控制器 RestController RequestMapping value base url public class MyController RequestMapping value child url method Req
  • PHP7构造函数类名

    我有一个 Laravel 4 2 应用程序 它可以与 PHP5 一起使用 没有任何问题 由于我安装了一个运行 PHP7 的新 vagrant box 一旦我运行一个模型 其中函数名称与类名称 关系函数 相同 就会出现错误 如下所示
  • 如何在 Laravel 5.4 中加载 Vue 组件?

    我已经运行 npm run watch 并收到了消息 This dependency was not found in resources assets js app js To install it you can run npm ins
  • 如何将自己的js文件导入到vite中?

    我将 Laravel 与 Vite 结合使用 我想使用 Vanilla JS 代码添加文件 在我使用mix之前 我从来没有使用过Vite 我尝试将此代码添加到文件 vite config js 中 如下例所示 laravel input r
  • 在 Laravel 中的编辑表单上获取选定选项

    我的网站订单有一个可编辑的表单 并且有以下字段 User quantity note status 我在此表单中还有其他选项 但只有这些字段对我来说很重要 以便能够获取默认值 例如 我希望能够查看用户默认订购的数量 然后我可以更改它或保留它
  • TDD/测试 CSS 和 HTML? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 有没有办法测试 CSS 和 HTML 例如 有时某些通知会受到某些 CSS 更改的影响 我不想每次进行更改时都手动测试所有通知 Tha
  • 带 url 参数的 Laravel post 路由

    我面临着幼虫路由的大墙 我似乎找不到解决方案 我在视图模板中有此表单
  • 如果 CMAKE_RUNTIME_OUTPUT_DIRECTORY 更改,CMake 无法找到测试

    我正在使用 CMake 构建我的项目 并且尝试为每个模块创建一堆测试套件 显然如果我修改变量CMAKE RUNTIME OUTPUT DIRECTORY那么 ctest 找不到要运行的测试并失败 我做了一个最小的例子来展示我正在谈论的内容
  • laravel - 使用请求类或输入类

    在宁静的控制器中 我应该使用哪个类来获取传递的变量 member gt email Input get email or member gt email Request get email 两种选择都适合我 但有什么区别 Input get
  • PHP - 类外 use 关键字和类内 use 关键字的区别

    伙计们 美好的一天 只是想问一下有什么区别use之外的class and use在 的里面class 我也用谷歌搜索过 但我的问题与答案不匹配 Example namespace App Http Controllers Auth use
  • 如何在 pytest 中将单元测试和集成测试分开

    根据维基百科 https en wikipedia org wiki Unit testing Description和各种articles https techbeacon com devops 6 best practices inte
  • 使用鼻子获取设置中当前测试的名称

    我目前正在使用鼻子编写一些功能测试 我正在测试的库操作目录结构 为了获得可重现的结果 我存储了一个测试目录结构的模板 并在执行测试之前创建该模板的副本 我在测试中执行此操作 setup功能 这确保了我在测试开始时始终具有明确定义的状态 现在
  • 在Windows上安装php Composer时出现错误

    在安装 Composer 以使用 Laravel 框架时 我遇到了一些错误 Download failed file get contents SSL operation failed with code 1 OpenSSL Error m
  • Laravel 保存/更新多对多关系

    谁能帮助我如何保存多对多关系 我有任务 用户可以有很多任务 任务可以有很多用户 多对多 我想要实现的是更新表格管理员可以将多个用户分配给特定任务 这是通过 html 多选输入完成的 name taskParticipants 这里的问题是
  • Laravel 白名单域认证

    我正在寻找只允许某些域访问我的 laravel 应用程序的最佳方法 我目前正在使用 Laravel 5 1 并且如果引用域不在白名单域中 则使用中间件进行重定向 class Whitelist Handle an incoming requ
  • 如何在 e2e AngularJS 测试中进行文件上传?

    在我的一种观点中 我有一个文件上传控件 它支持通过拖放或单击按钮后打开的标准文件对话框上传文件 How to do this in my e2e tests1 1 Just one of the two options will be en

随机推荐

  • 如何使用X509证书和C#进行非对称加密?

    我希望使用公钥和私钥使用 X509 证书加密文件 并将它们发送到远程服务器 我该怎么做 这可能吗 如何生成证书以及公钥和私钥对 See 这个问题 https stackoverflow com questions 1623189 rsacr
  • 在 Python 中使用列表理解查找最小/最大日期

    所以我有这个清单 snapshots 2014 04 05 2014 04 06 2014 04 07 2014 04 08 2014 04 09 我想使用列表理解找到最早的日期 这就是我现在所拥有的 earliest date snaps
  • Apache - 限制 IP 不起作用

    我有一个子域 我只想在内部访问 我试图通过编辑该域的 VirtualHost 块来在 Apache 中实现此目的 有人能看出我哪里出错了吗 注意 我这里的内部IP地址是192 168 10 xxx 我的代码如下
  • 在 PyQt 应用程序上使用 cx_freeze 时出现语法错误

    当尝试使用 PyQt4 从 Python 3 脚本构建 exe 文件时 这是一个非常烦人的问题 我认为这与使用有关uic动态加载模块 ui files cx freeze返回 File E Python32 32 lib site pack
  • 使用 array_multisort() 对多维 PHP 数组进行不区分大小写的排序

    经过大量搜索后 我无法找到有关如何使用 array multisort 按一个字段不区分大小写地对多维数组进行排序的良好解释 我发现在处理数据库查询信息时这是一个非常有用的功能 因此我想分享一下 我应该注意这仅适用于 php 5 4 Exa
  • ANDROID:不同尺寸的ImageView

    我是 android studio 的新手 因此 如果问题很琐碎 请原谅 我的问题是理解布局 我的布局和相应的值文件夹如下所示 我的问题是没有选择正确的布局 例如 对于 Nexus 4 4 7 英寸 768x1280 xhdpi 在横向模式
  • R Shiny:删除 ggplot2 背景以使其透明

    我想让 R Shiny Server 上的 ggplots 透明 我的绘图 ui R 如下 plotOutput malPie width 95 在 server R 中我的绘图函数如下 c lt ggplot dataFrame aes
  • 在pentaho中休息客户端

    我对 pentaho 数据集成工具非常陌生 我想从我的 pentaho 中使用一个安静的服务 post web 服务 为此 我发现我应该使用休息客户端 但是当我给出网址和正文 因为我想使用后期服务 时 它并没有在数据库中进行必要的更改 谁能
  • Moment.js 包含日期格式中间的文本

    我的格式为 2015 年 1 月 27 日上午 8 17 我需要使用 moment js 显示它 我正在使用格式 moment format MMM D YYYY at h mm A z 除了 at 这个词之外 一切都很好 我怎样才能让这个
  • 在oracle中创建密码字段

    安全外部密码存储 有什么用 我可以使用 安全外部密码存储 在 Oracle 表中创建密码字段吗 或者如何在不使用 安全外部密码存储 的情况下在 Oracle 表中创建密码字段 一种不使用 安全外部密码存储 无论是什么 的方法是将 RAW 1
  • 休眠级联持续

    我有一个关于 Hibernate 的一般性问题正在解决 我有 A 类和 B 类 其中 B 依赖于 A 在我的代码中 当我调用 em persist objOfTypeA 时 我希望插入并插入到表 AAA 和 BBB 中 如果我手动保留 A
  • Powershell:递归移动文件

    我正在尝试将所有构建输出文件和文件夹复制到Bin文件夹 输出目录 Bin 除了一些保留在输出目录 The Bin文件夹永远不会被删除 初始条件 Output config log4net file1 txt file2 txt file3
  • 删除 R 图形设备中的所有边距

    所以我在摆脱图形设备的整个边距时遇到了一些麻烦 我已将 mar 设置为 0 但边缘周围仍然存在一些持久空间 例如 plot new par mar c 0 0 0 0 plot window c 0 1 c 0 1 points c 1 1
  • 如何使用 foreachPartition 在 Spark 中为每个分区高效构建一个 ML 模型?

    我正在尝试为数据集的每个分区拟合一个 ML 模型 但我不知道如何在 Spark 中执行此操作 我的数据集基本上是这样的按公司划分 Company Features Target A xxx 0 9 A xxx 0 8 A xxx 1 0 B
  • C2DM实现PHP代码

    我正在创建使用 C2DM 推送通知的 Android 应用程序 但我在创建 php 代码以使用 c2dm 发送消息时遇到问题 请指导我如何使用 php 代码发送消息 实际上存在一个问题 即如何获取客户端身份验证令牌 我见过http code
  • ASP.NET MVC:如何设置 web.config 进行 LDAP 身份验证?

    我有一个正在运行的 LDAP 服务器 其参数如下 OU users OU mydomain O this domain LDAP myhost 389 I 成功地 access 使用通用 LDAP 客户端 就像 Jarek Gawor 的
  • 在 LINQ 中实现“不在”(又名“不存在”)逻辑

    Setup 我有两个List
  • Objective C 的 iPhone 开发中的“委托”是什么? [复制]

    这个问题在这里已经有答案了 Objective C 的 iPhone 开发中的 委托 是什么 委托是一个指向对象的指针 该对象具有委托持有者知道如何调用的一组方法 换句话说 就是启用特定回调的机制来自后来创建的对象 A 很好的例子是UIAl
  • 过滤二维数组并从中间返回坐标

    我有一个由零组成的二维数组 在 1 6 和 2 7 处有一些正整数 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0
  • Laravel 4 控制器测试 - 太多 $this->call() 后出现 ErrorException - 为什么?

    我非常感谢有关我遇到的 Laravel 4 问题的帮助 我正在测试控制器路由 特别是负责路由调查问卷响应的控制器 我正在测试以下场景 用户尝试跳过问题 用户请求不存在的问题 等等 到目前为止 我为所有场景编写的测试都可以使用 PHPunit