Laravel 5 PHPUnit 测试 json 帖子

Posted

技术标签:

【中文标题】Laravel 5 PHPUnit 测试 json 帖子【英文标题】:Laravel 5 PHPUnit test json post 【发布时间】:2016-07-28 19:03:03 【问题描述】:

我正在尝试按照officiel doc 测试 JSON API。我知道问题来自给 POST 请求的数据数组。该测试适用于像['hello' => 'world'] 这样的单级数组,所以显然 post 函数不能处理复杂的结构?我在这里做错了什么?

测试:

public function testInsert()

    $this->post(
        '/test',
        [
            'content' => 'Hello world!',
            'count' => [
                'a' => 12.345678,
                'b' => 12.345678
            ],
            'user' => [
                'id' => 1
            ]
        ],
        ['contentType' => 'application/json']
    )->seeJsonEquals([
        'status' => true
    ]);

错误:

unknown:myapp nobody$ phpunit
PHPUnit 4.8.24 by Sebastian Bergmann and contributors.

E.

Time: 648 ms, Memory: 15.25Mb

There was 1 error:

1) APITest::testInsert
ErrorException: Invalid argument supplied for foreach()

/Users/nobody/myapp/vendor/laravel/framework/src/Illuminate/Support/Arr.php:487
/Users/nobody/myapp/vendor/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/MakesHttpRequests.php:231
/Users/nobody/myapp/tests/APITest.php:43

FAILURES!
Tests: 2, Assertions: 2, Errors: 1.

控制器:

public function store() 
    $user = User::find(Input::get('user.id'));

    // TODO: Validate input using JSON schema

    if (empty($user))
        $errors[] = 'User does not exist.';

    if (empty(Input::get('content')))
        $errors[] = 'Content is empty.';

    $a = Input::get('location.latitude');
    if ($a < 15)
        $errors[] = 'A out of range.';

    $b = Input::get('location.longitude');
    if ($b < 20)
        $errors[] = 'B out of range.';

    if (empty($errors)) 
        $post = new Post();

        $post->content = Input::get('content');
        $post->count()->create([
            'a' => $a,
            'b' => $b
        ]);

        $user->posts()->save($user);

        $post->save();

        return APIUtils::makeStatusResponse(true);
    

    return APIUtils::makeStatusResponse(false, $errors);

【问题讨论】:

也发布你的控制器方法。 【参考方案1】:

我使用laravel new myapp 命令重新安装了我的 Laravel 应用程序,现在一切正常。我假设问题来自使用 composer create-project --prefer-dist laravel/laravel may 进行的先前安装。

【讨论】:

以上是关于Laravel 5 PHPUnit 测试 json 帖子的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.1 使用 JSON 的 API 的 PHPUnit 测试

Laravel 5.2 PHPUnit JSON Api 请求正文未设置

带有 JSON 请求的 Laravel/phpunit 测试丢失了重要的请求细节

如何在 PHPUnit / Laravel 中模拟 JSON 文件

在 laravel 4 中使用 phpunit 测试 POST

Laravel 5 PHPUnit - 从路由返回了无效的 JSON