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

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

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

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

【问题讨论】:

    标签: laravel laravel-nova


    【解决方案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作为它,就像在stackoverflow.com/a/57897472中所做的那样
        猜你喜欢
        • 2020-06-22
        • 2021-09-14
        • 1970-01-01
        • 1970-01-01
        • 2019-06-13
        • 2019-02-22
        • 1970-01-01
        • 1970-01-01
        • 2019-11-23
        相关资源
        最近更新 更多