2017-10-09 89 views
1

目前我在測試類中使用很多工廠factory(),有沒有辦法減少到1,所以我只能在測試方法中使用factory(Something::class)最小化工廠測試?

我使用很多的原因是因爲我必須傳遞一些外鍵。

$user = factory(User::class)->create(); 

$token = factory(Token::class)->create([ 
    'user_id' => $user->id, 
]); 

$provider = factory(Provider::class)->create([ 
    'user_id'  => $user->id, 
    'token_id'  => $token->id, 
]); 

$something = factory(Something::class)->create([ 
    'provider_id' => $provider->id, 
]); 

    // Now test with $something 
+0

你需要知道'$ user'或任何外鍵?或者只是用'$ something'做點什麼? – Jono20201

+0

我不在乎它是哪個'$ user'。所有的工廠使用faker, –

+0

我只需要使用'factory(Something :: class)'與$ something –

回答

1

你可以用這樣的語法:

$factory->define(Something::class, function ($faker) { 
    return [ 
     'title' => $faker->title, 
     'content' => $faker->paragraph, 
     'provider_id' => function() { 
      return factory(Provider::class)->create()->id; 
     } 
    ]; 
}); 

$factory->define(Provider::class, function ($faker) { 
    $user = factory(User:class)->create(); 
    return [ 
     'user_id' => $user->id, 
     'token_id' => function() { 
      return factory(Token::class)->create(['user_id' => $user->id])->id; 
     } 
    ]; 
}); 

,然後在你的測試,你可以只使用:

$something = factory(Something::class)->create(); 

注意根據您的需求,它可以導致一些副作用 - 例如在使用Provider工廠時,用戶將始終創建可能很好或不符合您的測試。當然,如果需要,您可以隨時創建的helper方法,將包裹你所表現出的方​​法和只返回的東西,然後在您的測試,你可以只使用:

$something = $this->createSomething();