Laravel 在做 Unit 测试时, 如何跳过中间件?

问题:

Laravel框架在做Unit测试时,如何跳过中间件?

细节补充:

   我有一个Auth登录验证中间件,但我在做完这个功能的时候,其他模块的接口已经有近百个了!我不想再给每个接口都去补充一下验证登录的前置步骤;所以希望能跳过Auth的验证。这应该是最方便的解决办法!但我没有在论坛或者其他技术论坛找到解决办法!

希望有类似解决办法的大哥帮我指点迷津!

多谢!

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

或许这个可以帮到你:https://stackoverflow.com/questions/343573...

4年前 评论
goudan (楼主) 4年前
讨论数量: 6

或许这个可以帮到你:https://stackoverflow.com/questions/343573...

4年前 评论
goudan (楼主) 4年前

哈哈,多谢 @tsin 大哥,问题解决了!多谢多谢!

4年前 评论

解决方案(一):

在需要跳过的中间件handle方法中加上一个判断:

if (env('APP_ENV') === 'testing') {
    return $next($request);
}

解决方案(二):

a). Laravel 版本从 5.5 开始支持withoutMiddleware方法;可以指定要禁用的中间件,而不是全部禁用它们。

$this->withoutMiddleware(\App\Http\Middleware\VerifyCsrfToken::class);

b). 如果Laravel版本小于5.5,则可以通过将更新的方法添加到基本TestCase类中以覆盖框架TestCase的功能来实现相同的功能。

c). 如果php版本大于7,可以将以下内容添加到TestCase类中,您将能够使用上述相同的方法调用。此功能使用PHP7中引入的匿名类。

/**
 * Disable middleware for the test.
 *
 * @param  string|array|null  $middleware
 * @return $this
 */
public function withoutMiddleware($middleware = null)
{
    if (is_null($middleware)) {
        $this->app->instance('middleware.disable', true);

        return $this;
    }

    foreach ((array) $middleware as $abstract) {
        $this->app->instance($abstract, new class {
            public function handle($request, $next)
            {
                return $next($request);
            }
        });
    }

    return $this;
}

转自 @tsin 提供的:https://stackoverflow.com/questions/343573... 解决方法

4年前 评论

不推荐跳过中间件,建议使用setUp方法或TestCase类创建request和user,并且每个test方法都应该考虑到用户未登录情况。

4年前 评论

use Illuminate\Foundation\Testing\WithoutMiddleware;

这个trait应该也能满足需求吧

4年前 评论
goudan (楼主) 4年前
goudan (楼主) 4年前
songxue77 (作者) 4年前

这头像骚啊

4年前 评论
goudan (楼主) 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!