代码之家  ›  专栏  ›  技术社区  ›  RonnyKnoxville

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

  •  0
  • RonnyKnoxville  · 技术社区  · 6 年前

    我正在尝试运行Laravel功能测试,使用模型工厂创建一些测试数据。

    在其他测试中,在相同的目录和命名空间中,使用类似的“make”特性,数据库中不会保存任何条目。但有了这一个,他们就是。

    使用时 app('env') 它返回 '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;
        }
    }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   ceejayoz    6 年前

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

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

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