【问题标题】:How can I assert an instance of a ResourceCollection in Laravel?如何在 Laravel 中声明 ResourceCollection 的实例?
【发布时间】:2020-07-22 07:11:38
【问题描述】:

我正在进行一项功能测试,它正在正确返回数据;一切都恢复正常;我的测试即将结束。

我很难断言我正在取回 ResourceCollection:

$this->assertInstanceOf(ResourceCollection::class, $response);

这是我的测试部分:

MyFeature.php

...

$http->assertStatus(200)
        ->assertJsonStructure([
            'data' => [
                '*' => [
                    'type', 'id', 'attributes' => [
                        'foo', 'bar', 'baz',
                    ],
                ],
            ],
            'links' => [
                'first', 'last', 'prev', 'next',
            ],
            'meta' => [
                'current_page', 'from', 'last_page', 'path', 'per_page', 'to', 'total',
            ],
        ]);

    // Everything is great up to this point...
    $this->assertInstanceOf(ResourceCollection::class, $response);

我得到的错误是:

断言 stdClass 对象 (...) 是类“Illuminate\Http\Resources\Json\ResourceCollection”的实例失败。

我不确定在这种情况下我应该断言什么。我正在取回资源集合,我应该使用什么来代替?感谢您的任何建议!

编辑

谢谢@mare96!您的建议使我采用了另一种似乎可行的方法。这是伟大的,但我不太确定我真的明白为什么......

这是我的完整测试(包括我的最终断言):

public function mytest() {
    $user = factory(User::class)->create();

    $foo = factory(Foo::class)->create();

    $http = $this->actingAs($user, 'api')
        ->postJson('api/v1/foo', $foo);

    $http->assertStatus(200)
        ->assertJsonStructure([
            'data' => [
                '*' => [
                    'type', 'id', 'attributes' => [
                        'foo', 'bar', 'baz'
                    ],
                ],
            ],
            'links' => [
                'first', 'last', 'prev', 'next',
            ],
            'meta' => [
                'current_page', 'from', 'last_page', 'path', 'per_page', 'to', 'total',
            ],
        ]);

    $this->assertInstanceOf(Collection::class, $http->getOriginalContent());
}

【问题讨论】:

  • 你试过$this->assertInstanceOf(ResourceCollection::class, $response->getOriginalContent());吗?
  • 谢谢!!我没有 - 但是你的建议引发了另一个最终奏效的想法。这很好,但不确定我是否完全理解为什么......我更新了我的问题,希望你能解释一下,这样我就可以理解我做了什么?
  • 不客气。这是因为内容是您需要测试的。这行得通吗?我需要输入它作为答案吗? :)

标签: laravel laravel-7 laravel-testing


【解决方案1】:

正如我在上面的评论中所说,您的内容将是 Collection 的实例。

你可以这样做:

$this->assertInstanceOf(Collection::class, $http->getOriginalContent());

因此,您可以尝试调试,使其更清晰,如下所示:执行dd($http); 您应该得到一个Illuminate\Foundation\Testing\TestResponse 的实例,与您执行$http->dump(); 时不一样吗?

所以你需要断言一个只是内容的实例,而不是整个响应。

我希望至少能帮上一点忙。

【讨论】:

  • 这完全有道理。非常感谢您花时间解释!
猜你喜欢
  • 1970-01-01
  • 2018-07-17
  • 2013-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多