문제

공장 소녀는 테스트를위한 모델 인스턴스를 쉽게 만들기 위해 레일의 편리한 프레임 워크입니다.

로부터 공장 소녀 홈페이지:

factory_girl을 사용하면 각 모델의 프로토 타입을 신속하게 정의하고 테스트에 중요한 속성이있는 인스턴스를 요청할 수 있습니다.

예제 (홈페이지에서도) :

Factory.sequence :email do |n|
    "somebody#{n}@example.com"
end

# Let's define a factory for the User model. The class name is guessed from the
# factory name.
Factory.define :user do |f|
    # These properties are set statically, and are evaluated when the factory is
    # defined.
    f.first_name 'John'
    f.last_name  'Doe'
    f.admin      false
    # This property is set "lazily." The block will be called whenever an
    # instance is generated, and the return value of the block is used as the
    # value for the attribute.
    f.email      { Factory.next(:email) }
end

사용자가 필요한 경우 전화 할 수 있습니다

test_user = Factory(:user, :admin => true)

공장 프로토 타입에 지정된 모든 속성을 가진 사용자를 생성합니다. 제외하고 명시 적으로 지정한 관리자 속성의 경우. 또한 이메일 공장 방법은 호출 할 때마다 다른 이메일을 산출합니다.

나는 Java와 비슷한 것을 구현하는 것이 매우 쉽다고 생각하지만 휠을 재창조하고 싶지 않습니다.

추신 : Jmock과 EasyMoc에 대해 알고 있지만 여기서 조롱 프레임 워크에 대해 이야기하고 있지 않습니다.

도움이 되었습니까?

해결책

이를위한 가능한 도서관 중 하나입니다 소스퍼.

그러나 생성하는 객체의 속성을 지정하려면 Java의 정적 타이핑은 프레임 워크를 무의미하게 만듭니다. 프레임 워크가 반사 또는 Java Bean 내성을 사용하여 속성 액세서를 찾을 수 있도록 속성 이름을 문자열로 지정해야합니다. 그것은 리팩토링이 훨씬 더 어려워 질 것입니다.

객체를 새로운 것을 새로 올리고 방법을 호출하는 것이 훨씬 간단합니다. 테스트에서 많은 보일러 플레이트 코드를 피하려면 테스트 데이터 빌더 패턴이 도움이 될 수 있습니다.

다른 팁

나는 또한 공장 소녀와 동등한 Java를 찾았지만 결코 그런 것을 찾지 못했습니다. 대신, 나는 처음부터 솔루션을 만들었습니다. Java에서 모델을 생성하기위한 공장 : 모델 시민.

Factory Girl에서 영감을 얻은 현장 주석을 사용하여 모델의 기본값을 설정하고 위키의 간단한 예:

@Blueprint(Car.class)
public class CarBlueprint {

    @Default
    String make = "car make";

    @Default
    String manufacturer = "car manufacturer";

    @Default
    Integer mileage = 100;

    @Default
    Map status = new HashMap();
}

이것은 자동차 모델의 청사진입니다. 이것은 새로운 인스턴스가 다음과 같이 생성 될 수있는 것보다 modelfactory에 등록됩니다.

ModelFactory modelFactory = new ModelFactory();
modelFactory.registerBlueprint( CarBlueprint.class );
Car car = modelFactory.createModel(Car.class);

클래스 대신 자동차 인스턴스를 전달하고 필요에 따라 값을 설정하여 자동차 모델의 값을 무시할 수 있습니다.

Car car = new Car();
car.setMake( "mustang" );
car = modelFactory.createModel( car );

그만큼 위키 더 복잡한 예제가 있습니다 (@Mapped 사용과 같은) 그리고 몇 가지 종과 휘파람에 대한 세부 사항.

  1. 나는 이것이 모든 사람을위한 것이 아니라 당신을 이해한다는 것을 이해합니다 ~할 수 있었다 Java 코드에 대해 Ruby 테스트 코드를 작성하십시오. (jtest)
  2. Java 에서이 작업을 수행하는 선호하는 방법은 테스트 데이터 빌더 무늬. 나는이 접근법이 프레임 워크 또는 외부 의존성의 복잡성을 도입하는 것을 실제로 보증하지 않는다고 주장한다. 프레임 워크를 사용하여 훨씬 덜 지정하고 더 많은 것을 얻을 수있는 방법을 알지 못합니다 ... Builder Syntax는 본질적으로 FactoryGirl 구문과 동일합니다. (누군가가 나를 자유롭게 설득 할 수 있습니다!)

나는 이것이 당신이 찾고있는 것이 아니라는 것을 알고 있습니다 ...

나는 과거에 반사를 사용하여 콩 값을 채우는 코드를 작성했습니다. 기본 아이디어는 모든 세터를 찾고 더미 값으로 각각 호출하는 것입니다. 내 버전은 모든 문자열을 필드 세트 이름의 이름으로 "이름"으로 호출 한 다음 모든 ints를 1로, 부울에서 true 등으로 설정합니다.

그런 다음 객체 마더 및 테스트 데이터 빌더와 유사한 패턴과 함께 이것을 사용했습니다.

테스트 데이터에 대한 좋은 시작을 제공했으며 특정 값이 필요한 필드는 테스트의 일부로 명시 적으로 설정할 수 있습니다.

도움이 되었기를 바랍니다.

동일한 질문으로 여기에 도착했으며 통합 테스트를 위해 데이터 생성 도구에 필요했습니다. 나는 그루비와의 도전을 받아들이기로 결정했다. 권력 주장.

방금 작은 도우미를 썼습니다 https://gist.github.com/pgaertig/9502960 아래와 같은 데이터 스크립트를 작성할 수있는 FactoryGrill;).

insert('MyTable', ID: 1, CREATED_AT: new Date(), NAME: 'Example text')

위는 다음과 같습니다.

INSERT INTO MyTable(ID, CREATED_AT, NAME) VALUES (1, ..current date here.., 'Example text')

그루비로 더 많은 일을 할 수 있습니다.

import org.apache.commons.lang3.RandomStringUtils;

for ( i in 0..9 ) {
     insert('USERS', CREATED_AT: new Date(), EMAIL: "test${i}@mydomain.com",
                     SALT: RandomStringUtils.randomAlphanumeric(32));
}

load(new File('usersettings.groovy').text)    //script nesting etc

공장이 그루비에서 상당히 직접적이기 때문에 실제로 공장이 아닙니다. 맵 생성자 또는 Expandos.

위의 ~ 30loc에서만 달성되기 때문에 FactoryGirl의 참조 및 기타 물건은 현재 사용할 수 없습니다. 그러나 내 솔루션에 관심이 있다면 Github에 전용 프로젝트를 추가하겠습니다.

모델 객체가 간단한 경우 프레임 워크를 사용하여이를 작성 해야하는 이유가 없습니다. 단순히 '새'연산자를 사용하십시오. 복잡한 모델 (복잡한 관계)이 있다면 Spring을 사용하여 함께 바인딩 할 수 있습니다 (테스트 시나리오에서도 스프링을 사용할 수 있음).

  • 그러나 이것은 단순히 데이터 객체를위한 것입니다. 무언가를 수행하는 객체를 인스턴스화하는 것에 대해 이야기하는 경우 실제 인스턴스를 사용하는 대신 외부 관계를 조롱/스터브하는 것이 좋습니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top