2017-10-09 215 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();