2016-10-21 4 views
1

인증 된 사용자로 메소드를 테스트 할 때마다 사용자 테이블과의 관계가 있으므로 항상 역할 테이블을 삽입 한 다음 새 사용자를 작성합니다.Laravel 5.2 testing DRY 원리를 따르는 방법?

아래 코드와 같습니다.

<?php 

use Illuminate\Foundation\Testing\WithoutMiddleware; 
use Illuminate\Foundation\Testing\DatabaseMigrations; 
use Illuminate\Foundation\Testing\DatabaseTransactions; 
use App\Models\User; 
use App\Models\Role; 

class CouponsTest extends TestCase 
{ 
    /** 
    * A basic test example. 
    * 
    * @return void 
    */ 

    use DatabaseMigrations; 
    //use WithoutMiddleware; 

    public function test_index_coupon(){ 

     //factory(App\Models\Coupon::class, 5)->create()->toArray(); 

     DB::table('roles')->insert([ 
      ['id' => 1, 'name' => 'customer'], 
      ['id' => 2, 'name' => 'partner'], 
      ['id' => 3, 'name' => 'admin'], 
     ]); 


     $user = User::create([ 
      'id' => 3, 
      'password' => bcrypt('123456789'), 
      'email' => '[email protected]', 
      'role_id' => '3', 
      'status' => 'confirmed', 
      'balance' => 0, 
     ]); 

     $this->actingAs($user)->visit('admin/coupons')->seePageIs('admin/coupons'); 


    } 


    public function test_create_coupon() 
    { 

     DB::table('roles')->insert([ 
      ['id' => 1, 'name' => 'customer'], 
      ['id' => 2, 'name' => 'partner'], 
      ['id' => 3, 'name' => 'admin'], 
     ]); 

     $user = User::create([ 
      'id' => 3, 
      'full_name' => 'Admin Full Name', 
      'password' => bcrypt('123456789'), 
      'email' => '[email protected]', 
      'role_id' => '3', 
      'status' => 'confirmed', 
      'balance' => 0, 
     ]); 

     $this->actingAs($user)->visit('admin/coupons/create')->seePageIs('admin/coupons/create'); 

    } 
} 

나는 이것이 나쁜 습관임을 알고있다.

내 코드는 DRY 원칙을 준수해야합니까?

답변

0

ModelFactory.php을 사용하고 모델에 대한 공장을 정의하는 것이 일반적입니다.

해당 모델에 인수를 전달할 수도 있습니다.

$factory->define(App\User::class, function (Faker\Generator $faker) { 
    static $password; 
    return [ 
     'name' => $faker->name, 
     'email' => $faker->unique()->safeEmail, 
     'password' => $password ?: $password = bcrypt('secret'), 
     'remember_token' => str_random(10), 
     'role_id' => factory(App\Role::class)->create()->id, 
    ]; 
}); 


$factory->define(App\Role::class, function(Faker\Generator $faker){ 
    return [ 
     'name' => $faker->name, 
    ]; 
} 

그런 다음 테스트에서 다음을 수행 할 수 많은 테스트에 필요한 경우

$role = factory(App\Role::class)->create(['name' => 'admin']); 

$adminUser = factory(App\User::class)->create(['role_id' => $role->id]); 

이 시험에 한 번 setup() 방법을 수행하고 테스트의 보호 변수로 관리 사용자를 정의 할 수 있습니다 수업 .

테스트가 끝날 때 위의 명령으로 작성된 항목을 제거하려면 테스트 클래스에 use DatabaseTransactions; 특성을 사용해야합니다.