zoukankan      html  css  js  c++  java
  • lumen 使用 dingo API 在 phpunit 中 404 的解决方法, 以及鉴权问题

    1. phpunit.xml 中添加 dingo 相关配置

    <env name="API_STANDARDS_TREE" value="x"/>
    <env name="API_SUBTYPE" value="prime"/>
    <env name="API_VERSION" value="v1"/>
    <env name="API_DEFAULT_FORMAT" value="json"/>
    <env name="API_STRICT" value="false"/>
    <env name="API_PREFIX" value="api"/>
    

    2. dingo 的路由配置文件包含不能使用 require_once。

    否则, 可能会出现一种情况是, phpunit 中第一个请求成功了, 但是后面的请求都 404。

    这里涉及到的一个知识点是:laravel 或 lumen phpunit 中每一个 test 都会使用独立的  Application 以及 TestCase 实例来运行,我们知道,框架在初始化的时候会加载路由的配置,如果我们的进程只跑一遍,这样其实没什么问题。

    但是,phpunit 中的 TestCase 是,一个进程,然后一个 TestCase 里面有多少 test 方法,就会进行多少次框架的初始化操作,这样问题就出现了,后续的请求中,require_once 不能再读取到任何配置信息,因此导致了后续请求全部 404 了。

    所以需要使用 require 代替 require_once。

    知识点:同一个进程中,require_once 只有第一次 require 会执行文件里面的内容,后续 require 不再加载文件。

    3. 在测试中添加以下方法调用

    1. phpunit.xml 中添加 dingo 相关配置
    <env name="API_STANDARDS_TREE" value="x"/>
    <env name="API_SUBTYPE" value="prime"/>
    <env name="API_VERSION" value="v1"/>
    <env name="API_DEFAULT_FORMAT" value="json"/>
    <env name="API_STRICT" value="false"/>
    <env name="API_PREFIX" value="api"/>
    
    2. dingo 的路由配置文件包含不能使用 require_once
    否则, 可能会出现一种情况是, phpunit 中第一个请求成功了, 但是后面的请求都 404
    
    3. 在测试中添加以下方法调用
    public function setUp()
    {
        parent::setUp();
    
        // 跳过 api 验证
        $user = ModulesUserModelsUser::with(['company'])->find(61339);
        $this->actingAsApi($user);
    }
    
    /**
     * Sets the API user.
     *
     * @param  mixed  $user
     * @return $this
     */
    protected function actingAsApi($user)
    {
        // mock service middleware
        /** @var MockeryMock $auth */
        $auth = Mockery::mock('DingoApiHttpMiddlewareAuth[handle]',
            [
                Mockery::mock('DingoApiRoutingRouter'),
                Mockery::mock('DingoApiAuthAuth'),
            ]);
        $auth->shouldReceive('handle')
            ->andReturnUsing(function ($request, Closure $next) {
                return $next($request);
            });
        $this->app->instance('DingoApiHttpMiddlewareAuth', $auth);
        $auth = Mockery::mock('DingoApiAuthAuth[user]',
            [
                app('DingoApiRoutingRouter'),
                app('IlluminateContainerContainer'),
                [],
            ]);
        $auth->shouldReceive('user')
            ->andReturnUsing(function () use ($user) {
                return $user;
            });
        $this->app->instance('DingoApiAuthAuth', $auth);
    
        return $this;
    }
    

      

  • 相关阅读:
    剑指offer——用两个栈实现队列
    根据前序和中序重建二叉树、后序和中序重建二叉树
    归并排序
    排序
    快速排序(java版)
    List
    单链表的基本操作
    集合
    数组
    结构体
  • 原文地址:https://www.cnblogs.com/eleven24/p/9640276.html
Copyright © 2011-2022 走看看