我试图运行Laravel功能测试,使用Model Factory创建一些测试数据。
在其他测试中,在同一目录和命名空间内,使用类似的' make' traits,数据库中没有保存任何条目。但是他们就是这样。
使用app('env')
时,它会返回'testing'
,因此环境正确。
关于如何在不保存到mySQL数据库的情况下运行这些测试的任何想法?
RoleTest
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;
}
}
答案 0 :(得分:0)
Laravel具有回滚对数据库所做的更改的特性。在5.6中,它是the RefreshDatabase
trait - 在某些早期版本中it was DatabaseTransactions
instead。
这些特征应该添加到所有进行数据库更新/插入的测试中。
(为了更加方便(和安全),测试应该在单独的数据库连接上运行,也可以使用单独的数据库副本。)