Запретить комбинации параметров
Я пытаюсь использовать 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# не на должном уровне.
1 ответ
В конце концов я решил проблему следующим образом
[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, все еще хороша.