gmn*_*gmn 8 c# tdd autofixture
使用AutoFixture作为SutFactory,我可以看到,如果我注册或冻结某个类型的值,那么该值将用于该类型的所有后续用法.但是,如果我在构造函数中有一个具有两个相同类型的参数的类,例如:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
有哪些策略可以使用自动混合为参数A和参数B注入唯一的预定义值,以便测试计算值?
*不幸的是我不能在这里分享我的确切场景,但它使用命令模式操作另一个对象,所以设置parameterA和parameterB维护设计的唯一方法是将它们两者都注入,而构造函数是最好的方法在这种情况下这样做.
一种选择是为所有实例定制创建算法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
Run Code Online (Sandbox Code Playgroud)
这是我的观察,大多数时候,当我遇到这样的场景时,我并不特别需要在它们传递给构造函数之前控制它们,而是我需要知道值是什么.
通过向类中添加结构检查属性,可以轻松完成:
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 }
}
Run Code Online (Sandbox Code Playgroud)
现在,您可以请求AutoFixture创建一个ClassA实例,而无需进一步调整,然后查询有关值的实例.
在更多地使用这些功能后,我个人发现发生这种情况的对象并不多,因此为该类创建一个简单的自定义可能是最好的选择,例如:
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 )));
}
}
Run Code Online (Sandbox Code Playgroud)
我发现这仍然为我提供了 AutoFixture 的灵活性,而不会影响注入 ParameterA 或 ParameterB 的特定实例的能力(您可以使用构建器方法、构造函数等来设置它们......而不是在自定义中随机值)。