Laravel在运行单元测试时保存到数据库

时间:2018-03-02 19:40:00

标签: laravel testing laravel-5 phpunit functional-testing

我试图运行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;
    }
}

1 个答案:

答案 0 :(得分:0)

Laravel具有回滚对数据库所做的更改的特性。在5.6中,它是the RefreshDatabase trait - 在某些早期版本中it was DatabaseTransactions instead

这些特征应该添加到所有进行数据库更新/插入的测试中。

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