【问题标题】:Disable route filters when testing in Laravel 4.2在 Laravel 4.2 中测试时禁用路由过滤器
【发布时间】:2018-10-27 20:15:39
【问题描述】:

我正在尝试编写测试来测试我一直在开发的旧应用程序上的 API 点。 我拥有的路线受到auth 过滤器的保护。

routes.php

$route->post('protected/route', ['before' => 'auth', 'uses' => 'ProtectedController@someProtectedTask']);

ProtectedControllerTest.php

public function testSomeProtectedTask {
    $routePayload = [...];
    $response = $this->call('POST', 'protected/route', [], [], [], $routePayload)
    $this->assertResponseOk();
}

我得到的响应是“预期状态码 200,得到 401”(未授权)。

我已经尝试添加

$this->app->forgetMiddleware('auth');

setUptestSomeProtectedTask 方法没有多大成功。过滤器应该在测试 Laravel 时关闭,但我不确定,我无法找到如何完全关闭它们。

编辑:

我后来发现我的环境设置为'production' 而不是'testing',因为测试配置错误,但问题仍然有效,因为我也需要测试'auth' 过滤器。 可以通过添加Route::enableFilters() 来开启测试。 更多关于这个topic


问题:

有谁知道如何在测试中关闭auth 过滤器而不在测试前将其注释掉?或者有没有更好的方法在 Laravel 4.2 中测试 API 端点并以某种方式模拟身份验证?

【问题讨论】:

  • 您可以从路由中删除'before' => 'auth',或者您可以更新filters.php 中的auth 过滤器以在测试期间为某些路由返回true。
  • 我已经尝试过前者,但我不喜欢这样,因为有一些测试可以验证路由是否经过身份验证。后者我没有尝试。你有什么建议如何为特定路线做吗?
  • 在 auth 过滤器中,为排除的路由创建一个数组,然后检查 in_array(Request::path(), $exclude)。如果您在测试环境中工作,则可以添加额外的检查以查看它所在的环境。

标签: php testing laravel-4


【解决方案1】:

尽管@aynber 在 cmets 中发布了一些很好的提示,但我仍然无法在一项测试中测试 auth 并在另一项测试中将其关闭。

我最终得到的解决方案是为这个特定的测试模拟一个用户。

ProtectedControllerTest.php

public function testSomeProtectedTask {
    $routePayload = [...];

    $this->be(new \Implementation\Of\UserInterface); //simulate logged in user

    $response = $this->call('POST', 'protected/route', [], [], [], $routePayload)
    $this->assertResponseOk();
}

【讨论】:

    猜你喜欢
    • 2015-01-21
    • 2016-01-06
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    相关资源
    最近更新 更多