【问题标题】:Customize AutoFixture property generation using constrained random values使用受约束的随机值自定义 AutoFixture 属性生成
【发布时间】:2018-12-07 07:37:05
【问题描述】:

上下文

我想创建一个我的类的集合,但它的一些字符串属性具有约束值。我希望这些值在约束集中仍然是随机的。

我想出了自定义的方式,但我的随机生成实现似乎没有使用任何 AutoFixture 功能,我不想重新发明轮子:

var random = new Random();
var fixture = new Fixture();
fixture.Customize<MyClass>(b => b
    .With(i => i.MyProperty, random.Next(2) == 0 ? "O" : "C"));

var result = fixture.CreateMany<MyClass>(1000);

问题

有没有更有效的方法告诉 AutoFixture 我想要一个随机字符串“O”或“C”?

编辑

同时我意识到上面的代码根本不起作用,所以它不符合“备份”计划的条件。 (表达式:random.Next(2) == 0 ? "O" : "C" 只计算一次)

【问题讨论】:

  • @MarkSeemann:也许是我,但我不知道这两个链接是如何回答的。两个链接都在自定义特定对象“MyClass”或 StreetName 生成。在我的情况下,对象是“字符串”。顺便说一句,我意识到我的示例不起作用,因为表达式 "random.Next(2) == 0 ? "O" : "C"" 只评估了一次(我理解为什么,这不是问题的一部分)。我也理解域建模会更好,但是当我的任务是编写单元测试时,我无法根据我应该如何编码的想法来重写企业应用程序。
  • 好的,我已经重新打开了帖子,所以我会把链接留在这里,以便其他人可以看到我链接的内容:stackoverflow.com/q/47761145/126014
  • 解决此问题的最简单方法可能是引入您使用ElementsBuilder 配置的特定于测试的帮助程序类型,然后添加一个ISpecimenBuilder 将某些字符串的请求转发到该帮助程序类型.有关一些示例,请参见上述链接以及以下链接:stackoverflow.com/a/49492820/126014
  • 好的,三个都读完了。尽管一切都很清楚,但对于简单的日常任务来说,它们太过分了。我的意思是在数据模型中可能有无数简单类型属性(字符串、整数),我们必须从有限的集合中进行选择。对于所有这些属性,我们必须反复引入辅助对象,并编写数十行代码。主要使用复制和粘贴(或开发辅助基础设施以防止复制和粘贴)听起来并不实用,而且生产力增强...

标签: c# unit-testing autofixture


【解决方案1】:

由于AutoFixture 4.6.0,您可以在With 自定义函数中使用回调。这允许限制字段值,但让它仍然在创建的样本之间变化。

源代码示例:

[Fact]
public void CustomizeMany()
{
    var fixture = new Fixture();
    var items = fixture.Build<MyClass>()
        .With(x => x.EvenNumber, (int number) => number * 2)
        .CreateMany(1000)
        .ToArray();

    Assert.All(items, item => Assert.Equal(0, item.EvenNumber % 2));
}

public class MyClass
{
    public int EvenNumber { get; set; }
}

您可以调整样本以满足您的特定需求。

【讨论】:

    猜你喜欢
    • 2018-03-31
    • 2016-08-25
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    相关资源
    最近更新 更多