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.

的所有测试中

(为了更加方便(和安全),测试也应该 运行 在单独的数据库连接上使用单独的数据库副本。)