2012-10-29 6 views
5

저는 XUnit의 이론과 결합 된 AutoFixture의 힘을 정말 고맙게 생각합니다. 나는 최근에 encapsulating customizations의 사용을 채택하여 속성을 통해 테스트에 제공했습니다.AutoFixture를 위해 사용자 정의 이론 데이터 속성이 생성하는 조명기를 어떻게 수정할 수 있습니까?

가끔 내 테스트를 실행하기 위해 일회성 시나리오가 필요합니다. 위와 같이 AutoDomainDataAttribute를 사용할 때 IFixture를 요청할 수 있으며 특성으로 생성 된 동일한 인스턴스를 가져올 수 있습니까?

필자의 시나리오에서는 콜렉션 등에 기본적으로 MultipleCustomization을 사용하고 있습니다.하지만이 경우에는 하나의 항목 만 SUT 생성자에게 보내야합니다. 그래서, 난 그렇게처럼 내 시험 방법을 정의했습니다 :

[Theory, AutoDomainData] 
public void SomeTest(IFixture fixture) { 
    fixture.RepeatCount = 1; 
    var sut = fixture.CreateAnonymous<Product>(); 
    ... 
} 

을 익명의 제품을 만들 때 불행하게도, 나는 예외를 받고 있어요. 이러한 속성을 가진 메서드 매개 변수로 Product를 요청하면 다른 테스트도 제대로 작동합니다. 필자의 FixDure 매개 변수가 내 AutoDomainDataAttribute에 의해 생성 된 매개 변수와 동일하기를 바라는이 특별한 경우에만 문제가됩니다.

제품의 생성자는 AutoDomainData를 통해 현재 위치에있는 사용자 정의로 인해 일반적으로 3 개의 항목으로 채워지는 IEnumerable을 예상합니다. 현재, 내 DomainCustomization은 MultipleCustomization과 AutMoqCustomization으로 구성된 CompositeCustomization입니다.

예외 : "InvalidCastException : 'Castle.Proxies.ObjectProxy'유형의 개체를 'Product'유형으로 캐스팅 할 수 없습니다." 당신은 속성의 활성화와 동일한 고정 장치 인스턴스가 필요한 경우

답변

7

, 당신은이처럼 사용자 정의 자체에기구를 삽입 할 수 있습니다

public class InjectFixtureIntoItself : ICustomization 
{ 
    public void Customize(IFixture fixture) 
    { 
     fixture.Inject(fixture); 
    } 
} 

그냥 전에 CompositeCustomization 이를 추가해야합니다 AutoMoqCustomization은 IFixture가 인터페이스이기 때문에 AutoMoqCustomization이 먼저 오면 Mock 인스턴스 (AFAICT)를 얻습니다. 현재 동적 성 프록시에서 발생하고있는 작업입니다. 나는 가끔 ... 날 것으로 보인다

[Fact] 
public void SomeTest() 
{ 
    var fixture = new Fixture().Customize(new DomainCustomization()); 
    fixture.RepeatCount = 1; 
    var sut = fixture.CreateAnonymous<Product>(); 
    // ... 
} 

훨씬 쉽게 될 : 당신이 정말이기구의 인스턴스를 필요로하는 경우


그러나, 왜 그냥 일반, 필수 시험 방법을 작성하지 이것도 저도 해주세요 ...

그래도 전체적인 문제를 해결할 수 있도록 다른 방법으로 API 또는 테스트 사례를 구사할 수 없으면 궁금합니다. I 매우 요즘 나는 RepeatCount 속성을 조작해야한다는 것을 알지 못합니다. 왜 그렇게하고 싶은지 궁금합니다.

그래도 별도의 스택 오버 플로우 질문의 대상입니다.

+0

감사합니다. 나는 즉시 여기에 게시 한 후 명령 테스트 방식으로 전환했다. 대체 방법을 아는 것이 좋습니다. 마지막으로, 제 특정 테스트는 마지막 카테고리를 제품에서 제거 할 수 없도록 보장합니다 (적어도 하나는 있어야 함). 이것은'RepeatCount'를 제어하는 ​​데 필요한 유일한 시간입니다. 다시 한 번 감사드립니다! – ventaur

+0

'카테고리를 제거 할 수 없습니까?Count() - 1' 항목을 먼저 테스트 설정의 일부로 먼저 선택하고 왼쪽으로 하나만 제거하면 마지막 항목을 제거 할 수 없습니다. –

+0

네, 그렇게 생각합니다. 우리 프로그래머들은 때로는 복잡한 일로 고통을 겪습니다. :-) – ventaur