Запретить комбинации параметров

Я пытаюсь использовать 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, все еще хороша.

Другие вопросы по тегам