2016-10-21 3 views
1

Каждый раз, когда мне нужно протестировать метод как аутентифицированный пользователь, я всегда вставляю таблицу ролей, потому что она имеет отношение к пользовательской таблице, а затем создает нового пользователя.Испытание Laravel 5.2 Как следовать принципу 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; в тестовом классе, чтобы удалить записи, созданные командами выше в конце ваших тестов.

Смежные вопросы