2

我有一个属性,我想在 的集合上进行测试Stuff,其中一个Stuff满足某个属性。我有一种方法可以生成Stuff令人满意的属性,还有一种方法可以生成不满足的属性Stuff

今天,我正在做这样的事情(是的,我在 C# 中使用 FsCheck):

IEnumerable<Stuff> GetStuffCollection(int input)
{
    yield return GenerateStuffSatisfyingProperty(input);
    yield return GenerateStuffNotSatisfyingProperty(input);
}

[Fact]
public void PropertyForCollectionHolds()
{
    Prop.ForAll(Arb.Choose(1,5), input =>
    {
        var collection = GetStuffCollection(input);

        return collection.SatisfiesProperty();
    }).VerboseCheckThrowOnFailure();
}

但这对排序进行了硬编码,即Stuff集合中满足属性的排序;我也想仲裁。

一种方法是嵌套Prop.ForAll调用;一个生成确定排序的东西的外部生成器,以及一个内部生成器,它是我上面的那个,但将控制排序的参数传递给集合构建器:

IEnumerable<Stuff> GetStuffCollection(int input, bool first)
{
    if (first)
    {
        yield return GenerateStuffSatisfyingProperty(input);
        yield return GenerateStuffNotSatisfyingProperty(input);
    }
    else 
    {
        yield return GenerateStuffNotSatisfyingProperty(input);
        yield return GenerateStuffSatisfyingProperty(input);
    }
}

[Fact]
public void PropertyForCollectionHolds()
{
    Prop.ForAll(Arb.Default.Bool(), first =>
        Prop.ForAll(Arb.Choose(1,5), input =>
        {
            var collection = GetStuffCollection(input, first);

            return collection.SatisfiesProperty();
        }).VerboseCheckThrowOnFailure()
    ).VerboseCheckThrowOnFailure();
}

但这感觉很笨拙和令人费解。是否有更简单和/或更惯用的方法来实现相同的目标,即测试两个任意输出的笛卡尔积?

4

1 回答 1

0

您可以使用Gen.Shuffle以不同的顺序生成序列:

var gen = from input in Gen.Choose(1, 5)
          let sc = GetStuffCollection(input)
          from shuffled in Gen.Shuffle(sc)
          select shuffled

然后

Prop.ForAll(gen, collection => { ... })
于 2017-07-06T10:09:16.610 回答