【问题标题】:How to get distinct dates (yyyy-mm-dd) using AutoFixture如何使用 AutoFixture 获取不同的日期(yyyy-mm-dd)
【发布时间】:2019-11-08 19:55:30
【问题描述】:

我有一个测试用例,我需要 4 个不同的日期来构建我的对象。 我发现的一切似乎都表明 AutoFixture 总是会生成独特的元素,但问题是当它生成日期时,它会考虑到所有细节。结果是当我对结果执行.ToShortDateString() 时,我可能会得到重复的结果。

我知道我可以循环直到我只得到不同的值,但感觉不对。

目前,我拥有的是:

string[] dates;
do
{
  dates = _fixture.CreateMany<DateTime>(4).Select(d => d.ToShortDateString()).ToArray();
} while (dates.Distinct().Count() != 4);

【问题讨论】:

    标签: c# autofixture


    【解决方案1】:

    正如@MarkSeeman 在this post 中提到的关于数字的内容

    目前,AutoFixture 会努力创建唯一编号,但不能保证这一点。例如,您可以耗尽范围,这很可能发生在字节值 [...]

    如果数字唯一性对测试用例很重要,我建议在测试用例本身中明确说明。为此,您可以将 Generator 与 Distinct 结合使用

    所以对于这种特定情况,我现在使用

    string[] dates = new Generator<DateTime>(_fixture)
                         .Select(x => x.ToShortDateString())
                         .Distinct()
                         .Take(4).ToArray();
    

    【讨论】:

    • 这可能是最好的方法
    【解决方案2】:

    您可以生成唯一的整数(比如说天),然后将其添加到某个最小日期:

    var minDate = _fixture.Create<DateTime>().Date;
    var dates = _fixture.CreateMany<int>(4).Select(i => minDate.AddDays(i)).ToArray();
    

    但我不确定 AutoFixture 是否保证所有生成的值都是唯一的(例如,参见 this issue

    【讨论】:

    • 有趣的答案。不是我预期的方向,但它可以做到。另一方面,我想保持所有日期的随机性。如果没有其他东西进来,我会给你功劳。至于唯一性,你是对的,正如作者(stackoverflow.com/a/35174444/955444)在这篇文章中提到的那样
    猜你喜欢
    • 1970-01-01
    • 2015-11-18
    • 2018-03-31
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多