我正在尝试使用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生成min
和max
的值,约束条件是min
绝不能大于max
?
C#中的示例将不胜感激,因为我对F#的了解还不够。
答案 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指出的替代方法仍然是一个好方法。