8

使用 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;
    }
}

使用自动夹具为参数 A 和参数 B 注入唯一的预定义值以测试计算值有哪些策略?

*不幸的是我不能在这里分享我的确切场景,但是它使用命令模式来操作另一个对象,所以设置参数A和参数B维护设计的唯一方法是将它们都注入,而构造函数是最简洁的方法在这种情况下执行此操作。

4

3 回答 3

6

据我观察,大多数时候当我遇到这样的场景时,我并不特别需要在将值传递给构造函数之前控制它们,而是我需要知道这些值是什么。

这很容易通过将结构检查属性添加到类中来实现:

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 }
}

现在您可以毫不费力地要求 AutoFixture 创建 ClassA 的实例,然后查询该实例的值。

于 2013-06-09T09:24:13.913 回答
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
于 2013-06-08T18:11:34.513 回答
2

更多地使用这些功能后,我个人发现发生这种情况的对象并不多,因此在这里为该类创建一个简单的自定义可能是最好的,例如:

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 )));
    }
}

我发现这仍然为我提供了 AutoFixture 的灵活性,而不会影响注入 ParameterA 或 ParameterB 的特定实例的能力(您可以使用构建器方法、构造函数等来设置它们......而不是在自定义中随机值)。

于 2013-08-13T17:29:57.437 回答