【发布时间】: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');
到setUp 和testSomeProtectedTask 方法没有多大成功。过滤器应该在测试 Laravel 时关闭,但我不确定,我无法找到如何完全关闭它们。
编辑:
我后来发现我的环境设置为'production' 而不是'testing',因为测试配置错误,但问题仍然有效,因为我也需要测试'auth' 过滤器。
可以通过添加Route::enableFilters() 来开启测试。
更多关于这个topic。
问题:
有谁知道如何在测试中关闭auth 过滤器而不在测试前将其注释掉?或者有没有更好的方法在 Laravel 4.2 中测试 API 端点并以某种方式模拟身份验证?
【问题讨论】:
-
您可以从路由中删除
'before' => 'auth',或者您可以更新filters.php中的auth过滤器以在测试期间为某些路由返回true。 -
我已经尝试过前者,但我不喜欢这样,因为有一些测试可以验证路由是否经过身份验证。后者我没有尝试。你有什么建议如何为特定路线做吗?
-
在 auth 过滤器中,为排除的路由创建一个数组,然后检查
in_array(Request::path(), $exclude)。如果您在测试环境中工作,则可以添加额外的检查以查看它所在的环境。