3

我试图让我的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() ...

我究竟做错了什么?我在模型中看到了这种精确的技术,但显然它不适用于 Auth 类。

4

3 回答 3

13

当您使用Auth类时,您可以使用以下方法模拟它:

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

这样你facade就会被嘲笑!

希望能帮助到你!

于 2013-07-11T20:22:10.357 回答
3

好吧,你可能在这里做错了......

tl;博士

定义一个模拟身份验证适配器并配置身份验证以在测试中使用它。在控制器中使用 Auth 的静态方法就可以了。

为什么这有效...

Auth 包实现了一个驱动程序(又名适配器)模式,其中 Auth 类充当整个包的依赖管理器和单例接口。与其尝试将模拟 Auth 实例注入控制器,不如实现模拟 Auth 适配器(如默认的 Eloquent 和 Fluent 适配器)。还可以尝试将您的 Auth 配置为在测试中使用 In-Memory Adapter。从手册页(对于懒惰的人)强调我的:

内存中的会话

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

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

于 2013-04-07T03:57:00.153 回答
-1

太棒了,我们可以为所有测试用例移动到 TestCase 类,我们可以给一个名字,像这样:

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

      $this->be($user);
}

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

这肯定会奏效。

谢谢,

于 2018-03-22T07:36:11.560 回答