2013-06-08 3 views
8

AutoFixture를 SutFactory으로 사용하면 형식에 대한 값을 등록하거나 고정하면 해당 값이 사용됩니다 해당 유형의 모든 후속 사용 그러나, 나는 같은 생성자에 같은 종류의 두 개의 매개 변수를 가진 클래스가있는 경우 : 전략을 테스트 할 목적으로 parameterA 및 parameterB 고유 미리 정의 된 값을 삽입하는 autofixture를 사용하여 존재 무엇SutFactory로 AutoFixture를 사용할 때 독립형 값을 가진 동일한 유형의 1 개 생성자 매개 변수를 정의/관리

public class ClassA 
{ 
    public double ParameterA { get; private set;} 
    public double ParameterB { get; private set;} 

    public ClassA(double parameterA, double parameterB) 
    { 
     ParameterA = parameterA; 
     ParameterB = parameterB; 
    } 

    public void Execute(ClassB object) 
    { 
     object.Value = (object.Value * ParameterA) /ParameterB; 
    } 
} 

계산 된 값?

* 불행히도 여기서 정확한 시나리오를 공유 할 수는 없지만 다른 오브젝트에서 작동하는 명령 패턴을 사용하므로 parameterA 및 parameterB를 설정하는 유일한 방법은 디자인을 유지 보수하는 것뿐입니다. 이 경우에 가장 깔끔한 방법입니다.

+0

http://stackoverflow.com/a/15550506/11635는 문제를 해결하지만 @Mark Seemann의 대답은 더 나은 길일 가능성이 높습니다 –

답변

2

그래서 클래스에 대한 간단한 정의를 작성, 조금 더, 나는 개인적으로 이런 너무 많은 개체가없는 것으로 나타났습니다 기능을 사용하는 데, 여기에 아마도 가장 좋은 예입니다 이것은 여전히 ​​ParameterF 나 ParameterB의 특정 인스턴스에 삽입하는 기능을 손상시키지 않으면서도 AutoFixture에 대해 뛰어난 유연성을 제공한다는 것을 알았습니다 (사용자가 빌더 메소드, 생성자 등을 사용하여 설정할 수 있음). 임의로 사용자 정의하는 대신 값).

5

하나의 옵션은 모든 인스턴스에 대해 생성 알고리즘을 사용자 정의하는 것입니다. ClassA. 그들은 생성자에 전달되기 전에

var valueA = 1; 
var valueB = 2; 

var fixture = new Fixture(); 
fixture.Customize<ClassA>(c => c 
    .FromFactory(() => 
     new ClassA(valueA, valueB))); 

var result = fixture.Create<ClassA>(); 
// -> parameterA value is 1 
// -> parameterB value is 2 
+2

그냥 궁금 해서요 ... "Register"보다는 "Customize"를 강조한 이유는 무엇입니까? ? –

+0

아니오, 특별한 이유가 없습니다. 실제로'Customize'가 더 명시 적입니다 ..'Register'와'Customize' 모두 같은 결과를 얻습니다 :) –

+0

@RubenBartelink, 저의 레지스터가이 시나리오를 해결하지 못할 것이라고 생각합니다. 단순히 두 개의 인수를 동일한 값으로 설정합니다. 위의 경우에 나는 주입을 위해 제어 할 수있는 두 개의 다른 매개 변수를 지정해야한다. 미래의 생성자 인수에 대해 내 테스트를 유연하게 유지하면서 가급적 바람직하다. – gmn

5

그것은 시간의 대부분은 내가 그런 시나리오가 발생 내 관찰이다, 나는 특히이 아니라 I가 필요, 제어 값이 필요하지 않습니다 값을 알고 있습니다. 클래스에 Structural Inspection Properties를 추가하여 달성 쉽게

:

public class ClassA 
{ 
    public ClassA(double parameterA, double parameterB) 
    { 
     this.A = parameterA; 
     this.B = parameterB; 
    } 

    public double A { get; private set } 

    public double B { get; private set } 
} 

이제 속히를 ClassA의 인스턴스를 생성 AutoFixture를 요청할 수 있으며, 이후 값에 대한 인스턴스를 쿼리합니다.

public class ClassACustomization: ICustomization 
{ 
    public double ParameterA { get; set;} 
    public double ParameterB { get; set;} 

    public void Customize(IFixture fixture) 
    { 
     //Note: these can be initialized how you like, shown here simply for convenience. 
     ParameterA = fixture.Create<double>(); 
     ParameterB = fixture.Create<double>(); 
     fixture.Customize<ClassA>(c => c 
      .FromFactory(() => 
      new ClassA(ParameterA , ParameterB))); 
    } 
} 

I :

+0

대개 저는 당신과 동의합니다. 이 경우 (나는이 질문에서 명확하지 않음), 내가 검증하고자하는 두 가지 값에 의존하는 계산을하는 상황에 대해 더 생각하고 있습니다. 두 가지 주장이 내가 확인할 수있는 계산에 대한 합리적인 의견을 얻는 것이 무엇인지 알아야합니다. – gmn

+3

잠시 동안 의존성이 기본 요소가 아니라 인터페이스 인 경우를 고려하면 정확한 값은 중요하지 않습니다. 만약 그렇다면, 클래스는 Liskov 대체 원칙을 깨기 쉽습니다. 경험에 비추어 볼 때, 같은 종류의 원칙이 원시적 종속성에 적용된다고 생각하기 시작했습니다. 값이 중요하다면 아마도 의존성이 아닐 것입니다. 아마도 이러한 값이 메소드 인수로 전달되는 것이 더 나은가? 또는 결국 인터페이스 또는 클래스로 더 잘 모델링 된 것으로 나타났습니다. 당신의 시나리오를 공유 할 수 있습니까? –

+0

나는 당신이 요점을 보았고, 일반적으로 말해서, 내가 달성하려고 시도하고있는 것을 밝혀주는 데 도움이된다면, 좀 더 구체적으로 업데이트했다. – gmn