Laravel 单元测试从具有身份验证的测试调用路由

Laravel unit testing calling a Route from a Test with authentication

我正在测试我的 api。在调用路由之前,我将用户登录到应用程序。 问题是在身份验证后,用户的 ID 未分配给路由调用中的 Auth::id()

场景如下:

测试方法:

public function testApiGetOrder()
{
    var_dump($this->user);  // first dump
    Auth::login($this->user); // Can't use $this->be($this->user) here, it would not help anyway...
    var_dump(Auth::id());  // second dump

    $response = $this->call('GET', '/order/' . $this->order->getKey());

    $this->assertResponseOk();
    $this->assertJson($response->getContent());
    $this->assertJsonStringEqualsJsonString($this->order->toJson(), $response->getContent());
}

OrderController 的方法:

public function show($id)
{
    var_dump(Auth::id());  // third dump
    var_dump(Auth::user()->getKey());   // fourth dump

    // Calling model's logic here
}

testApiGetOrder 的输出:

第一次转储:object(User)
第二个转储:int(1)
第三次转储:NULL
第四次转储:int(1)

为什么用户id的值没有分配给Auth::id()

您说的不是同一个 Auth 实例。

在您的测试中,您获得了一个 Auth 库的实例,您可以在其中登录并取回数据。 当你调用时,控制器有它自己的 auth 实例(运行 在 Laravel 框架内)

创建测试的更简洁的方法是使用 Auth 库的模拟。它由 Laravel 测试,在单元测试期间你想测试最小的代码片段。

public function testApiGetOrder()
{
    Auth::shouldReceive('id')->with($this->user->getKey())
                             ->once()->andReturn($this->user);

    Auth::shouldReceive('user')->once()->andReturn($this->user);

    $response = $this->call('GET', '/order/' . $this->order->getKey());

    $this->assertResponseOk();
    $this->assertJson($response->getContent());
    $this->assertJsonStringEqualsJsonString($this->order->toJson(), $response->getContent());
}