禁止参数组合

时间:2018-12-20 14:11:25

标签: c# xunit.net fscheck property-based-testing

我正在尝试使用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生成minmax的值,约束条件是min绝不能大于max

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

1 个答案:

答案 0 :(得分: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();
    }
}

我希望测试参数与被测物的签名相匹配,以使测试尽可能容易理解。预处理参数会分散我实际要测试的内容。

尽管如此,@ Ruben指出的替代方法仍然是一个好方法。