Laravel 在 运行 单元测试时保存到数据库
Laravel saving to database when running unit tests
我正在尝试 运行 Laravel 功能测试,使用模型工厂创建一些测试数据。
在其他测试中,在同一目录和命名空间内,使用类似的 'make' 特征,没有条目保存在数据库中。但是有了这个,他们就是了。
使用app('env')
的时候returns'testing'
,所以环境是正确的。
关于如何在不保存到 mySQL 数据库的情况下 运行 这些测试有什么想法吗?
角色测试
namespace Tests;
use Tests\Traits\MakeRoleTrait;
class RoleTest extends BrowserKitTestCase
{
use MakeRoleTrait;
public function testGetChildren()
{
$childRoles = [];
$baseRoles = [];
for ($i = 0; $i < 4; $i++) {
$parentId = null;
if($i > 0){
$parentId = $baseRoles[$i-1]->id;
}
$childRole = $this->makeRole();
// Create base role
$baseRoles[] = $this->makeRole([
'parent_id' => $parentId,
'display_name' => $childRole->display_name,
'site_id' => null
]);
if($i < 3){
$childRoles[] = $childRole;
}
}
$children = $childRoles[0]->getChildren();
$this->assertEquals($childRoles,$children);
}
}
MakeRoleTrait
namespace Tests\Traits;
use Faker\Factory as Faker;
use App\Models\Role;
use App\Repositories\RoleRepository;
trait MakeRoleTrait
{
/**
* Create fake instance of Role and save it in database
*
* @param array $roleFields
* @return Role
*/
public function makeRole($roleFields = [])
{
/** @var RoleRepository $roleRepo */
$roleRepo = \App::make(RoleRepository::class);
$theme = $this->fakeRoleData($roleFields);
return $roleRepo->skipPresenter()->create($theme);
}
/**
* Get fake instance of Role
*
* @param array $roleFields
* @return Role
*/
public function fakeRole($roleFields = [])
{
return new Role($this->fakeRoleData($roleFields));
}
/**
* Get fake data of Role
*
* @param array $roleFields
* @return array
*/
public function fakeRoleData($roleFields = [])
{
$role = factory(\App\Models\Role::class,1)->make();
$array = $role->first()->toArray();
$array = array_merge(
$array,
$roleFields
);
return $array;
}
}
Laravel 具有 roll-back 对数据库所做更改的特征。在 5.6 中,它是 the RefreshDatabase
trait - in some earlier versions it was DatabaseTransactions
instead.
应将这些特征添加到使数据库 updates/inserts.
的所有测试中
(为了更加方便(和安全),测试也应该 运行 在单独的数据库连接上使用单独的数据库副本。)
我正在尝试 运行 Laravel 功能测试,使用模型工厂创建一些测试数据。
在其他测试中,在同一目录和命名空间内,使用类似的 'make' 特征,没有条目保存在数据库中。但是有了这个,他们就是了。
使用app('env')
的时候returns'testing'
,所以环境是正确的。
关于如何在不保存到 mySQL 数据库的情况下 运行 这些测试有什么想法吗?
角色测试
namespace Tests;
use Tests\Traits\MakeRoleTrait;
class RoleTest extends BrowserKitTestCase
{
use MakeRoleTrait;
public function testGetChildren()
{
$childRoles = [];
$baseRoles = [];
for ($i = 0; $i < 4; $i++) {
$parentId = null;
if($i > 0){
$parentId = $baseRoles[$i-1]->id;
}
$childRole = $this->makeRole();
// Create base role
$baseRoles[] = $this->makeRole([
'parent_id' => $parentId,
'display_name' => $childRole->display_name,
'site_id' => null
]);
if($i < 3){
$childRoles[] = $childRole;
}
}
$children = $childRoles[0]->getChildren();
$this->assertEquals($childRoles,$children);
}
}
MakeRoleTrait
namespace Tests\Traits;
use Faker\Factory as Faker;
use App\Models\Role;
use App\Repositories\RoleRepository;
trait MakeRoleTrait
{
/**
* Create fake instance of Role and save it in database
*
* @param array $roleFields
* @return Role
*/
public function makeRole($roleFields = [])
{
/** @var RoleRepository $roleRepo */
$roleRepo = \App::make(RoleRepository::class);
$theme = $this->fakeRoleData($roleFields);
return $roleRepo->skipPresenter()->create($theme);
}
/**
* Get fake instance of Role
*
* @param array $roleFields
* @return Role
*/
public function fakeRole($roleFields = [])
{
return new Role($this->fakeRoleData($roleFields));
}
/**
* Get fake data of Role
*
* @param array $roleFields
* @return array
*/
public function fakeRoleData($roleFields = [])
{
$role = factory(\App\Models\Role::class,1)->make();
$array = $role->first()->toArray();
$array = array_merge(
$array,
$roleFields
);
return $array;
}
}
Laravel 具有 roll-back 对数据库所做更改的特征。在 5.6 中,它是 the RefreshDatabase
trait - in some earlier versions it was DatabaseTransactions
instead.
应将这些特征添加到使数据库 updates/inserts.
的所有测试中(为了更加方便(和安全),测试也应该 运行 在单独的数据库连接上使用单独的数据库副本。)