2017-01-11 2 views
1

모델의 공장 모의 작업에 인터페이스 또는 계약을 부과하는 가장 Laravel 방법은 무엇입니까?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