6

(我没有找到这样做的方法,从源代码看来它不受支持,但我可能忽略了它)

我想做类似的事情:

(new Fixture())
    .CreateAnonymous<Circle>(
        new CircleSpecification { MinRadius = 1, MaxRadius = 5 }
    );

所以这是 AutoFixture 中已经存在的类似种子习语的变体,但种子习语是非常硬编码的(或者我认为如此)。

问题:是否可以自定义夹具以接受样本的参数?

到目前为止,我最好的想法是构建一个包含结果对象的特殊规范类,以便您可以执行以下操作:

public class CircleSpecification {
    public double MinRadius { get; set; }
    public double MaxRadius { get; set; }

    public Circle Circle { get; set; }
}

这样我就可以注册CircleSpecificationSpecimenBuilder可以使用的:

Circle circle = Fixture.CreateAnonymous<CircleSpecification>(
    new CircleSpecification { MinRadius = 0.0, MaxRadius = 5.0 }).Circle;

请注意,要使用带有种子重载的 CreateAnonymous 种子参数类型必须匹配方法返回类型。

4

1 回答 1

5

如果要在创建匿名实例时分配值,Circle可以使用以下Build方法:

var fixture = new Fixture();
var c = fixture
    .Build<Circle>()
    .With(x => x.Radius, 3)
    .CreateAnonymous();

但是,如果该属性没有什么特别之处Radius,为什么不干脆事后给它赋值呢?

var fixture = new Fixture();
var c = fixture.CreateAnonymous<Circle>();
c.Radius = 3;

后一个选项更具声明性,使您能够使用AutoFixture 的 xUnit.net 集成来编写更简洁的测试,从而消除所有意外的复杂性:

[Theory, AutoData]
public void Test3(Circle c)
{
    c.Radius = 3;

    // Act and assert here
}
于 2013-01-30T06:53:18.220 回答