测试 Laravel Nova

Posted

技术标签:

【中文标题】测试 Laravel Nova【英文标题】:Testing Laravel Nova 【发布时间】:2019-03-06 13:09:08 【问题描述】:

目前我正在尝试为 laravel nova 编写功能测试,以断言页面已正确加载并且可以看到数据。

但是,当我编写测试时,由于 laravel nova 数据的生成方式,我找不到一种方法来断言显示正确的文本。最重要的是,当加载不存在的资源页面时,我似乎无法测试页面是否正确加载,而 laravel nova 的 404 页面作为 200 响应返回。

有没有人找到一个很好的方法来测试新星?

【问题讨论】:

【参考方案1】:

在你的项目目录中添加 app/config 文件:

App\Providers\NovaServiceProvider::class,

【讨论】:

【参考方案2】:

TL;DR:查看这个 repo:https://github.com/bradenkeith/testing-nova。它帮助我找到了测试 Laravel Nova 的方法。

Laravel Nova 基本上是一个 CRUD 框架。所以我假设,当你说

“页面加载正确,可以看到数据”

您实际上的意思是:我的资源已正确加载。或者,我可以创建/更新/删除资源。这是因为 Nova 正在通过 api 调用异步加载其资源信息。 这就是为什么,测试逻辑的一个好方法是测试/nova-api/ 路由

例如:

<?php

namespace Tests\Feature\Nova;

use App\Note;
use Tests\TestCase;

class NoteTest extends TestCase

  public function setUp(): void
  
    parent::setUp();
  

  /** @test */
  public function it_gets_a_note()
  
    // given 
    $note = factory(Note::class)->create();

    $response = $this->get('/nova-api/notes/' . $note->id)
      ->assertStatus(200)
      ->assertJson([
        'resource'  =>  [
          'id'    =>  [
            'value' =>  $note->id
          ]
        ]
    ]);
  

通过调用路由https://my-app.test/resources/notes/1,我们可以断言我们得到了 200 响应(成功)并且我们实际上正在返回我们新创建的 Note。这是一个非常值得信赖的测试,可确保资源详细信息页面正常工作。

但是,如果您正在谈论 浏览器测试,您可能需要查看 Laravel Dusk:

Laravel Dusk 提供了一个富有表现力、易于使用的浏览器自动化和测试 API。

安装后,就可以开始真正的浏览器测试了:

$user = factory(User::class)->create();
$user->assignRole('admin');

$this->browse(function (Browser $browser) use ($user) 
  $browser
    ->loginAs($user)
    ->visit('/')
    ->assertSee('Dashboard');
);

【讨论】:

【参考方案3】:

我遇到了同样的问题,我发现 App\Providers\NovaServiceProvider.php 中的门不让用户通过,只在测试时返回 true ,一切都必须按预期工作 p>

    protected function gate()

    Gate::define('viewNova', function ($user) 

        return true;
    );

【讨论】:

这将允许任何用户使用 Nova 仪表板。如果它投入生产,那最终可能会非常糟糕。更好的选择可能是在测试中覆盖这个门(可能来自setUp?),或者简单地创建一个具有适当权限的User并使用$this-&gt;actingAs作为它,就像在***.com/a/57897472中所做的那样

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

测试一个 Laravel 包

掌握 Laravel 的测试方法

Laravel 测试请求集正文

测试 laravel 路由识别方法类型

Laravel 单元测试显示完全错误

Laravel 测试无异常,抛出异常