2

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

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();
    }
4

1 回答 1

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))

请注意,您从sand中过滤空值p,因此它们永远不会为空。唯一可以为 null if 的东西e。但是,你做

where s <= e

如果为 null,则这种比较永远不会为真e,因为与 null 比较的任何东西总是错误的。所以你也过滤掉了空值e

要修复,只需用对您的场景有意义的任何内容替换该条件,例如

where e == null || s <= e
于 2017-03-13T20:36:07.297 回答