测试Laravel框架中的session

简介

  • 有点一波三折的感觉,过程我就不说了,说原因的话就是我的被测试类中用到了session,但是在测试模拟session 上遇到了一些问题。
  • 我不确定我的解决办法是否完美,但总算是临时解决了。
  • 用的的工具是PHPUnit、Laravel5.5。

被测试类介绍

  • CFEApiExample 该类的结构大致如下:
class CFEApiExample 
{
  /**
   * CFEApiExample 构造方法,这里面的Request 理论上会被自动注入。
   * @param Request|null $request 请求对象,为了兼容变成可选参数
   */
  public function __construct(Request $request = null)
  {
    // 设置Session
    $request()->session()->put('name','linhai');
  }
}

测试代码

  • 我只写具体测试的那个方法的片段。
  /**
   * 测试方法,但是会报错 RuntimeException : Session store not set on request.
   */
  public function testCFEApiExample()
  {
     // oper 是被测试类的实例
     $oper = $this->app->make(CFEApiExample::class);
  }
  • 这是后报错:RuntimeException : Session store not set on request. 就是在测试中session 并没有初始化,我直观的想法是 session 没有设置正确,百度搜索了一下没有找到对应的问题。
image.png

粗暴解决

  • 我的解决方法比较粗暴,可能不是最优解,如果有更好的办法可以给我留言,谢谢,思路就是初始化一个Request,然后初始化一个存储器,之后直接通过参数初始化被测试类。
    /** @var $store \Illuminate\Session\Store */// 构造一个存储器
    $store = $this->app->make("Illuminate\Session\Store");
    // 创建Request 对象,需要 use Illuminate\Http\Request
    $request = new Request();
    // 一定要调用这个方法,千万不要调用 setSession 
    $request->setLaravelSession($store);
    // 以强硬的姿态直接初始化Api
    $oper = new CFEApiExample($request);

结束

  • 谢谢。

你可能感兴趣的:(测试Laravel框架中的session)