Laravel 5.1 使用 JSON 的 API 的 PHPUnit 测试
Posted
技术标签:
【中文标题】Laravel 5.1 使用 JSON 的 API 的 PHPUnit 测试【英文标题】:Laravel 5.1 PHPUnit Tests for API using JSON 【发布时间】:2015-09-26 18:46:44 【问题描述】:我刚开始在 Laravel 5.1 中使用单元测试来测试我正在构建的 API,我可以让 phpUnit 与 ExampleTest.php 一起正常工作,但是当我创建自己的测试时,它每次都失败。
这是我的 API 端点 v1/conversations
的响应:
"data": [
"id": 1,
"created_at": "2015-07-05",
"updated_at": "2015-07-07"
,
"id": 2,
"created_at": "2015-07-06",
"updated_at": "2015-07-08"
]
这是我的 ConversationsTest.php:
<?php
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;
class ConversationsTest extends TestCase
public function test_list_conversations()
$this->get('v1/conversations')->seeJson('data');
但是当我开始运行测试时,我得到以下信息:
There was 1 error:
1) ConversationsTest::test_list_conversations
ErrorException: Argument 1 passed to Illuminate\Foundation\Testing\TestCase::seeJson() must be of the type array, string given
我的 API 不是返回有效的 JSON 数据吗?为什么 Laravel 的 seeJson
方法不能解释响应?我尝试关注Laravel 5.1 Testing APIs documentation,但我显然遗漏了一些东西......
【问题讨论】:
它可能会返回 JSON,但错误告诉您的是,当它只接受数组时,您正在将字符串传递给seeJson()
函数。
看起来数据已经被格式化为有效的 JSON 格式......在这种情况下,将 JSON 格式化字符串更改为数组的最佳做法是什么?
我不熟悉这个功能,但我会写一个答案,希望能更好地解释。
【参考方案1】:
您的端点返回的数据很好,不应修改。该错误只是告诉您正在将字符串传递给函数seeJson('data');
根据这里的https://github.com/laracasts/Integrated/wiki/Testing-APIs,您应该能够像这样使用它来验证是否正在返回一些 JSON...
$this->get('v1/conversations')->seeJson();
你也可以给这个函数传入一个数组,看看是否存在某部分数据...
$this->get('v1/conversations')->seeJson([
'data' => 'some data',
]);
虽然这可能会失败,除非您传入端点返回的整个数组。
你唯一不能做的就是将一个字符串传递给这个函数,因为它不知道如何处理一个字符串。
【讨论】:
你的答案对我不起作用,因为 Laravel 会寻找一个 json 数组,但我的 Laravel 应用程序总是返回一个数组内的 json 对象。 这没有任何意义。有些东西要么是 json,要么不是 json。没有“json 对象”或“json 数组”之类的东西。 seeJson() 检查给定数组的包含:['checked' => 1] 结果为 [checked: 1]。 Laravel 返回 response()->json(): [checked: 1]。根本没有通过。 Laravel 不会随之返回,这取决于数组的结构。在这种情况下,您只需将其包装在另一个数组中。..->seeJson([['checked' => 1]]);
【参考方案2】:
试试这个
<?php
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;
class ConversationsTest extends TestCase
public function test_list_conversations()
$this->get('v1/conversations')->seeJson(['data']);
【讨论】:
以上是关于Laravel 5.1 使用 JSON 的 API 的 PHPUnit 测试的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 5.1 文档攻略 —— Eloquent:模型对象序列化
如何在 json 数据 laravel 5.1 中查询 Builder
自动加载中的 Laravel 5.1 Composer.json 调用文件