【问题标题】:AutoFixture : pass an argument to specimen builderAutoFixture : 将参数传递给样本生成器
【发布时间】:2013-01-29 18:06:47
【问题描述】:

(我没有找到办法,从源代码看来是不支持的,但我可能忽略了它)

我想做类似的事情:

(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 必须匹配方法返回类型。

【问题讨论】:

  • 你想用这个完成什么?
  • 我想创建一个测试数据构建器库,可用于编写单元测试(或集成测试)。这样我就可以构建一个业务对象,如:var bill = Fixture.CreateAnonymous&lt;Bill&gt;(new BillSpec { TotalAmount = 120.00, Tip = 15.00 }); - 并获得一张包含许多项目的账单。我可以只构建一个辅助方法,但感觉如果我使用 AutoFixture,我应该有 AutoFixture 来构建对象,如果我在 AutoFixture 之外构建我的 Bill,为什么我需要 AutoFixture?
  • Bill(或Circle)类的外观如何?
  • public class Circle { public double Radius { get; set; } }
  • 对于我的测试,有时我想要半径为 0 的圆,有时我希望它非常大,有时我想要一堆半径在 0 到 5 之间的圆。所以我在询问是否 AF API 允许向构建者提供额外的信息,以进一步将样本专门用于我的测试。像现在这样,大部分 AF 只依赖运行时类型来寻找构建器,所以一旦我配置了如何构建 Circle,每次都会使用该配置。

标签: autofixture


【解决方案1】:

如果您想在创建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's xUnit.net integration 编写更简洁的测试,消除所有意外的复杂性:

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

    // Act and assert here
}

【讨论】:

  • 原始问题(我不明白)可以重写为:如何使用基于种子的 AutoFixture 的工厂方法创建对象,但使用的种子不是生成的匿名实例的类型?或者:在调用基于种子的工厂方法时,我们如何将额外的自定义参数传递给我们的自定义 ISpecimenBuilder 类?
猜你喜欢
  • 2017-05-07
  • 1970-01-01
  • 1970-01-01
  • 2013-02-07
  • 2011-08-09
  • 1970-01-01
  • 2015-04-28
  • 2019-08-02
  • 1970-01-01
相关资源
最近更新 更多