在 Laravel 中测试而不通过身份验证

Ser*_*his 4 php phpunit laravel-5.1

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

在我的 RoleController 类中,我将其用于:

public function __construct()
{
    $this->middleware('auth');
}
Run Code Online (Sandbox Code Playgroud)

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

A request to [http://localhost/nuevo/rol] failed. Received status code [500].
Run Code Online (Sandbox Code Playgroud)

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

InvalidArgumentException: Nothing matched the filter [nombre] CSS query provided for [http://localhost/auth/login].
Run Code Online (Sandbox Code Playgroud)

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

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

nye*_*eke 6

要开始在Laravel 中进行测试驱动开发 (TDD),请转到安装根目录中的测试目录默认情况下提供PHPUnit测试的支持,因此您无需担心设置,因为这已经满足了 .

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

php artisan make:test RoleTest
Run Code Online (Sandbox Code Playgroud)

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

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

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

class RoleTest extends TestCase
{
    use WithoutMiddleware;

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

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

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

    $this->visit('/')
         ->see('Laravel');
}
Run Code Online (Sandbox Code Playgroud)

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

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

TL; 博士

只需使用$this->withoutMiddleware();您的方法在禁用中间件的情况下运行 PHPUnit 测试;没有$this->middleware('auth');哪个而是强制执行它。