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());
}
我正在测试我的 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());
}