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 不会随之返回,这取决于数组的结构。在这种情况下,您只需将其包装在另一个数组中。 ..-&gt;seeJson([['checked' =&gt; 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 API

自动加载中的 Laravel 5.1 Composer.json 调用文件

Laravel 5.1:如何使用 oauth2-server-laravel?

Laravel 5.1 oAuth 2 服务器“无效范围”错误