【问题标题】:How to generate null for nullable types with FsCheck?如何使用 FsCheck 为可空类型生成空值?
【发布时间】:2017-03-14 04:36:07
【问题描述】:

我有这个似乎可以工作的生成器,但是当我检查生成的值时,它从不选择空值。如何编写一个将选择空值的生成器。此代码从不为“结束”日期选择空值。

public static Gen<DateTime?> NullableDateTimeGen()
    {
        var list = new List<DateTime?>();

        if (list.Any() == false)
        {
            var endDate = DateTime.Now.AddDays(5);
            var startDate = DateTime.Now.AddDays(-10);

            list.AddRange(Enumerable.Range(0, 1 + endDate.Subtract(startDate).Days)
                .Select(offset => startDate.AddDays(offset))
                .Cast<DateTime?>()
                .ToList());

            list.Add(null);
            list.Insert(0, null);
        }

        return from i in Gen.Choose(0, list.Count - 1)
               select list[i];
    }

    public static Arbitrary<Tuple<DateRange, DateTime>> TestTuple()
    {
        return (from s in NullableDateTimeGen().Where(x => x != null)
                from e in NullableDateTimeGen()
                from p in NullableDateTimeGen().Where(x => x != null)
                where s <= e
                select new Tuple<DateRange, DateTime>(new DateRange(s.Value, e), p.Value))
                .ToArbitrary();
    }

【问题讨论】:

  • 究竟是什么不选择空值? NullableDateTimeGen 还是 TestTuple 函数?
  • @Evk: TestTuple

标签: c# fscheck


【解决方案1】:

问题与 FsCheck 无关,在此语句中:

from s in NullableDateTimeGen().Where(x => x != null)
            from e in NullableDateTimeGen()
            from p in NullableDateTimeGen().Where(x => x != null)
            where s <= e
            select new Tuple<DateRange, DateTime>(new DateRange(s.Value, e), p.Value))

请注意,您从 sp 过滤空值,因此它们永远不会为空。如果e,唯一可以为空的东西。但是,你这样做

where s <= e

如果e 为空,则这种比较永远不会为真,因为任何与空比较的东西总是假的。因此,您也可以过滤掉 e 的空值。

要解决这个问题,只需用对你的场景有意义的东西替换那个条件,比如

where e == null || s <= e

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 2010-10-16
    • 2012-10-05
    • 2020-07-28
    相关资源
    最近更新 更多