2017-01-11 11 views
1

モデルの工場モックにインターフェイスまたは契約を課す最もララベルな方法は何ですか?Laravelのモデル契約/インタフェース5

たとえば、モデルがDogであるとします。私はそれを模擬するために工場を使い、私はそれのためのテストを書く。私は契約/インタフェースに準拠していないインスタンスを模倣すると、エラーがスローされることを確認したい。

\アプリケーション\ Dog.php:私はこのテストを実行/ DogTest.php

class RoadshowUnitTest extends TestCase 
{ 
    /** @test **/ 
    public function i_should_be_able_to_make_a_dog() 
    { 
     $dog = factory(App\Roadshow::class, 1)->make(); 
     // ... internal type assertions go here 
    } 
} 

class Dog extends Model 
{ 
    protected $table = 'dogs'; 
    protected $fillable = ['name', 'breed' ]; // Dogs must have both of these 
} 

データベース/工場/ ModelFactory.php

$factory->define(App\User::class, function (Faker\Generator $faker) { 
    return [ 
     'name' => $faker->name // no mention of breed, which is required 
    ]; 
}); 

テスト、私はいくつかの種類のエラーを取得する必要があります。工場では重要なフィールドがないため、Dogをまったく生産できません。どのようにしてモデルに要件を課すのですか、それを使用するものはどれですか(工場のように)?

+1

「必須」と言えば、どういう意味ですか?データベース制約、コントローラでの検証など? – jackel414

+0

@ jackel414「必要な」レベルが異なる場合、「犬」(工場のような)のインスタンスなしでプロパティとして「繁殖」を登録するために必要なものは存在できません。インスタンスを作成するために、つまり言い換えれば必要です。 –

答えて

1

モデル・ファクトリは、渡すモデル・オブジェクトの新しいインスタンスを作成し、指定した属性(この場合は 'name'属性のみ)に値を割り当てます。 $user = new User;を実行して空のユーザーオブジェクトをインスタンス化するのと同じように、makeを実行したときのファクトリには、必要な数の属性を設定できます。

モデルクラスの永続インスタンスに適切なデータ属性が設定されていることを確認するには、次の操作を実行します。(カスタム要求クラスまたはコントローラ内の)要求データを検証する検証ロジックを追加するか、モデルデータを保持する。理想的には、両方を行うでしょう。 makeコマンドを使用して

(あなたはそれはあなたがmake()save()を行う、またはmake()の代わりにcreate()を使用することができます永続化したい場合は)まだデータベースに保存されていないデータを意味し、new Modelをやってと同じです。したがって、あなたが持っているすべてのデータベース制約は機能しません。同様に、それはHTTP要求ではないので(コントローラメソッドを呼び出さない)、あなたが持っている検証ロジックもヒットしていません。

申し訳ありませんが、これはちょっとした言い分です。簡単な答えは、モデルファクトリ自体がデータを検証しないことです。

+0

Model Factoryは強制的にインターフェイスを実装できますか? –

+0

モデルクラスは、インターフェイスを実装するためにはっきりと設定することができます(Laravelの基本Modelクラスを見ると、多くのインターフェイスが実装されています)。しかし、それを実装しているのはモデル工場ではありません。工場は単にクラスそのものを知らせます。 – jackel414