【问题标题】:Testing in Laravel without passing through auth在 Laravel 中进行测试而不通过身份验证
【发布时间】:2017-01-30 04:26:13
【问题描述】:

我正在尝试在 Laravel 5.1 中创建一个测试,但我想在没有授权表单的情况下使用它。

在我的 RoleController 类中,我把它放在了:

public function __construct()
{
    $this->middleware('auth');
}

我试过使用use WithoutMiddleWare;,但没有用。这是 phpunit 的输出:

A request to [http://localhost/nuevo/rol] failed. Received status code [500].

还尝试对每种测试方法使用$this->withoutMiddleware();,但这也不起作用。这是 phpunit 的输出:

InvalidArgumentException: Nothing matched the filter [nombre] CSS query provided for [http://localhost/auth/login].

测试不是访问“nuevo/rol”路由,而是向“auth/login”发出请求,因为它使用 auth 表单工作。

有没有一种方法可以在不使用授权表的情况下进行测试,或者我需要在我的测试代码中放入逻辑来使用它?

【问题讨论】:

  • 您在哪里创建测试?在您的 app/Http/Controller 目录中?
  • 不,在控制器中我唯一要做的就是在构造函数中加载身份验证中间件。我的测试在测试目录中,我尝试在其中禁用中间件。
  • 好的。刚刚在下面发布了一个解决方案。

标签: php phpunit laravel-5.1


【解决方案1】:

要开始使用 Laravel 中的 Test-driven development (TDD),请转到安装根目录中的 tests 目录(默认提供对 PHPUnit 测试的支持,因此您需要不用担心设置,因为这是already catered for)

要创建测试,请运行以下 Artisan 命令:

php artisan make:test RoleTest

上面的 Artisan 命令将在您的 tests 目录中创建一个新的 RoleTest 类,其中包含以下测试用例(在您新创建的 tests/RoleTest.php 文件中):

class RoleTest extends TestCase
{
    /**
     * A basic test example.
     *
     * @return void
     */
    public function testExample()
    {
        $this->assertTrue(true);
    }
}

要在运行测试之前禁用中间件,请使用 use WithoutMiddleware; 如下,以便将其应用于 RoleTest 类下的所有方法:

class RoleTest extends TestCase
{
    use WithoutMiddleware;

    /**
     * A basic test example.
     *
     * @return void
     */
    public function testExample()
    {
        $this->assertTrue(true);
    }
}

如果您想对选定的方法应用中间件的豁免,请仅在以下方法中使用 $this->withoutMiddleware();

public function testExampleWithoutMiddleware()
{
    $this->withoutMiddleware();

    $this->visit('/')
         ->see('Laravel');
}

只需在命令行界面中运行 phpunit 即可运行测试。

在上面的最后一个 sn-p 中,中间件被禁用 testExampleWithoutMiddleware 方法,我们在该方法中对站点或应用程序根目录中可用的资源进行测试访问(根据您的安装目录和/或您的routes.php文件中的规定)并检查它是否包含术语Laravel

TL;DR

只需使用 $this->withoutMiddleware(); 即可在禁用中间件的情况下运行 PHPUnit 测试;不是 $this->middleware('auth'); 而是强制执行它。

【讨论】:

  • 可能我没有解释清楚。我需要 $this->middleware('auth');在控制器中,因为我希望需要记录访问权限,并且在测试中我想绕过授权,但我已经尝试了您解释的两种方法,但都没有奏效。
  • 你的问题说没有通过身份验证!你想达到什么目标? 测试对启用中间件的页面的访问并以用户身份登录测试对启用中间件的页面的访问以免登录
  • 这会抛出异常 PHP 错误:在 /var/www/html/app/vendor/laravel/framework/src/Illuminate/Foundation/Testing/Concerns 中的 null 上调用成员函数 instance() /MakesHttpRequests.php
猜你喜欢
  • 2018-07-20
  • 2021-07-18
  • 2016-04-23
  • 1970-01-01
  • 1970-01-01
  • 2016-11-01
  • 2010-11-11
  • 2020-07-19
  • 2020-07-12
相关资源
最近更新 更多