如何在Laravel 4中模拟Auth类?

时间:2013-04-07 01:03:42

标签: laravel laravel-4

我正试图让AuthController可测试。我首先注入Auth类,以便在测试中模拟它:

public function __construct(Auth $auth)
{
    $this->auth = $auth;
}

然后,当我检查登录是否成功时,我会使用注入的类:

public function postLogin()
{
    // instead of Auth::attempt(Input::all())
    if ($this->auth->attempt(Input::all()) {
        return 'you are logged in!';
    } else {
        return 'login failed!';
    }
}

当我提交登录表单时,出现错误,Auth::attempt方法未定义:

FatalErrorException: Error: Call to undefined method Illuminate\Support\Facades\Auth::attempt() ...

我做错了什么?我在模型中看到了这个exact technique,但显然它不适用于Auth类。

3 个答案:

答案 0 :(得分:12)

使用Auth课程时,您可以使用以下方式进行模拟:

Auth::shouldReceive('attempt')->once()->andReturn(true)

这样你的facade就会被嘲笑!

希望它有所帮助!

答案 1 :(得分:3)

嗯,你可能在这里做错了......

TL;博士

定义模拟Auth适配器并配置Auth以在测试中使用 。在Controllers中使用Auth的静态方法就可以了。

为什么会这样......

Auth包implements a Driver (aka Adapter) pattern,其中Auth类充当整个包的依赖关系管理器和单例接口。您应该实现模拟Auth适配器(如默认的Eloquent和Fluent适配器),而不是尝试将模拟Auth实例注入控制器。在测试中也尝试configuring your Auth to use the In-Memory Adapter。从手册页(对于懒惰)强调我的:

  

记忆中的会话

     

“内存”会话驱动程序只使用一个简单的数组来存储当前请求的会话数据。 此驱动程序非常适合对应用程序进行单元测试,因为没有任何内容写入磁盘。它不应该用作“真正的”会话驱动程序。

内存适配器只是一个内存数组,由于您的测试与您的被测系统(SUT)共享线程,您可以在测试代码中自由检查会话内容以验证副作用身份验证和后置条件。

答案 2 :(得分:0)

这太棒了,我们可以移动到TestCase类的所有测试用例,我们可以给出一个名字,如下所示:

public function loginWithFakeUser()
{
      $user = new User([
        'id' => 1,
        'name' => 'yish'
      ]);

      $this->be($user);
}

当我们需要经过身份验证的用户时,我们可以调用loginWithFakeUser来假装用户。

这肯定会奏效。

谢谢,