1

我正在尝试使用 FsCheck 为DateTimeOffset在给定间隔内生成随机值的类编写基于基本属性的测试。

[Property]
public void ValueBetweenMinAndMax(DateTimeOffset min, DateTimeOffset max)
{
    var sut = new DateTimeOffsetGenerator();
    DateTimeOffset actual = sut.Next(min, max);
    Assert.True(min <= actual);
    Assert.True(max >= actual);
}

min当>时,该测试很快失败,max因为我验证了输入参数Next()并在这种情况下抛出一个ArgumentException

public DateTimeOffset Next(DateTimeOffset min, DateTimeOffset max)
{
    if (min > max)
    {
        throw new ArgumentException(nameof(min));
    }

    // ...
}

我不想更改实现以交换输入参数。而且我也不想在测试方法中这样做。

有没有办法教 FsCheck 生成minandmax值,其约束条件min不得大于该值max

C# 中的示例将不胜感激,因为我对 F# 的了解不达标。

4

1 回答 1

0

最后我解决了这样的问题

[Property(Arbitrary = new[] { typeof(MyArbitraries) })]
public void ValueBetweenMinAndMax((DateTimeOffset minValue, DateTimeOffset maxValue) bounds)
{
    // ...
}

public static class MyArbitraries
{
    public static Arbitrary<(DateTimeOffset minValue, DateTimeOffset maxValue)> DateTimeOffsetBounds()
    {
        return (from minValue in Arb.Generate<DateTimeOffset>()
                from maxValue in Arb.Generate<DateTimeOffset>()
                where minValue <= maxValue
                select (minValue, maxValue))
            .ToArbitrary();
    }
}

我希望测试参数与 sut 的签名相匹配,以使测试尽可能易于理解。预处理参数会分散我真正想要测试的内容。

尽管如此,@Ruben 指出的替代方案仍然是一个不错的选择。

于 2019-01-07T08:57:36.413 回答