Laravel 5.1 PHPUnit使用JSON测试API

时间:2015-07-08 17:35:59

标签: php laravel phpunit laravel-5

我刚刚开始使用Laravel 5.1中的单元测试来测试我构建的API,我可以使用ExampleTest.php使PHPUnit正常工作,但是当我创建自己的测试时,它每次都会失败

以下是我的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,但我显然遗漏了一些东西......

2 个答案:

答案 0 :(得分:3)

您的终端返回的数据很好,不应修改。该错误只是告诉您正在将字符串传递给函数seeJson('data');

根据这里的https://github.com/laracasts/Integrated/wiki/Testing-APIs,您应该可以像这样使用它来验证是否正在返回一些JSON ......

$this->get('v1/conversations')->seeJson();

您还可以将数组传递给此函数,以查看数据的某个部分是否存在......

$this->get('v1/conversations')->seeJson([
    'data' => 'some data',
]);

虽然这可能会失败,除非您传入整个数组,这也是您的端点返回的。

唯一不能做的是将字符串传入此函数,因为它不知道如何处理字符串。

答案 1 :(得分:1)

试试这个

<?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']);
    }
}