IFixture.Create<int>()生成的整数是否唯一?

The Wiki says数字是随机的,但这也告诉我们



GitHub上的两件相关的事情:

https://github.com/AutoFixture/AutoFixture/issues/2

https://github.com/AutoFixture/AutoFixture/pull/7

那这些单元测试呢?

https://github.com/AutoFixture/AutoFixture/blob/master/Src/AutoFixtureUnitTest/GeneratorTest.cs#L33

[Theory, ClassData(typeof(CountTestCases))]
public void StronglyTypedEnumerationYieldsUniqueValues(int count)
{
    // Fixture setup
    var sut = new Generator<T>(new Fixture());
    // Exercise system
    var actual = sut.Take(count);
    // Verify outcome
    Assert.Equal(count, actual.Distinct().Count());
    // Teardown
}

https://github.com/AutoFixture/AutoFixture/blob/master/Src/AutoFixtureUnitTest/GeneratorTest.cs#L57
[Theory, ClassData(typeof(CountTestCases))]
public void WeaklyTypedEnumerationYieldsUniqueValues(int count)
{
    // Fixture setup
    IEnumerable sut = new Generator<T>(new Fixture());
    // Exercise system
    var actual = sut.OfType<T>().Take(count);
    // Verify outcome
    Assert.Equal(count, actual.Distinct().Count());
    // Teardown
}

我还没有找到一个陈述说生成的数字是唯一的,只有那些暗示它的信息是唯一的,但是我可能是错的。

最佳答案

当前,AutoFixture努力创建唯一的数字,但是不能保证它是。例如,您可以用尽该范围,最有可能发生在byte值上。例如,如果您请求300个byte值,则将得到重复项,因为只有256个值可供选择。

初始设置用完后,AutoFixture会很高兴地重用值。另一种选择是抛出一个异常。

如果数字对于唯一的测试用例很重要,我建议在测试用例本身中使这个显式的成为可能。您可以为此将Generator<T>Distinct结合使用:

var uniqueIntegers = new Generator<int>(new Fixture()).Distinct().Take(10);

如果您使用的是AutoFixture.Xunit2,则可以通过测试方法参数请求Generator<T>:
[Theory, AutoData]
public void MyTest(Generator<int> g, string foo)
{
    var uniqueIntegers = g.Distinct().Take(10);
    // more test code goes here...
}

关于c# - AutoFixture 3生成的整数是否唯一?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35172186/

10-11 15:14