我正在从事一个电子商务项目,一家普通的书店。
我从“测试驱动”方法开始,直到现在我都完全坚持。
此Lumen Microservice项目上的不同端点已通过较早的测试,以确保它们执行CRUD操作。但是,由于必须通过令牌授权来保护Create,Update和Delete方法,因此我很困惑如何引入授权测试。
到目前为止,这是我的测试结构:
tests/app/Exceptions/HandlerTest.php
tests/app/Http/Controllers/BooksControllerTest.php
测试适用于索引,显示,存储,更新,删除。这是测试之一:
public function testStoreBookByPost()
{
$book = factory('App\Book')->make();
$this->post(
'/books',
[
'isbn' => $book->isbn,
'title' => $book->title,
'description' => $book->description,
'author' => $book->author,
'image' => $book->image,
'price' => $book->price,
'slug' => $book->slug
]
);
$this
->seeJson(
[
'created' => true
]
)
->seeInDatabase(
'books',
[
'title' => $book->title
]
);
}
我之前已经分离了异常处理程序测试,类似地,我更希望将AuthControllerTest
分离为AuthControllerTest.php
。
什么是最好的方法?
我是否需要通过重构所有BooksControllerTest
来编写授权测试?
还是应该只测试令牌的发行和无法操作数据库?可以吗?
答案 0 :(得分:0)
简短的回答:我需要通过重构所有BooksControllerTest
长答案:我发现了一种在测试期间登录虚拟用户的绝佳方法。
由此我创建了此方法。
public function loginWithUserGetJWT()
{
$user = factory('App\User')->create(
[
'password' => bcrypt('366643') // random password
]
);
$content = $this
->post(
'/auth/login',
[
'email' => $user->email,
'password' => '366643'
]
)
->seeStatusCode(200)
->response->getContent();
$token = json_decode($content)->token;
return $token;
}
我正在所有测试用例中重用此方法,就像这样:
public function testStoreBookByPost()
{
$token = $this->loginWithUserGetJWT();
$book = factory('App\Book')->make();
$this->post(
'/books',
[
'isbn' => $book->isbn,
'title' => $book->title,
'description' => $book->description,
'author' => $book->author,
'image' => $book->image,
'price' => $book->price,
'slug' => $book->slug,
'token' => $token
]
);
$this
->seeJson(
[
'created' => true
]
)
->seeInDatabase(
'books',
[
'title' => $book->title
]
);
}