使用AutoFixture将集合的属性设置为Xunit理论的数据

时间:2014-09-25 06:01:52

标签: unit-testing xunit.net autofixture

我是Xunit和AutoFixture的新手,并撰写了一个看起来像这样的理论:

[Theory, AutoData]
public void Some_Unit_Test(List<MyClass> data)
{
    // Test stuff
}

MyClass看起来像:

public class MyClass
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool IsActive { get; set; }
}

这会导致AutoFixture为每个属性创建一个具有随机值的项目列表。这很好,但我希望IsActive属性始终为真。

我可以在每次测试开始时将其设置为true,但我猜测有一种更聪明的方法。我查看了InlineDataClassDataPropertyData,甚至Inject(),但似乎没有任何内容。

我该如何改善这个?

2 个答案:

答案 0 :(得分:5)

以下是一种方法:

public class Test
{
    [Theory, TestConventions]
    public void ATestMethod(List<MyClass> data)
    {
        Assert.True(data.All(x => x.IsActive));
    }
}

TestConventionsAttribute定义为:

internal class TestConventionsAttribute : AutoDataAttribute
{
    internal TestConventionsAttribute()
        : base(new Fixture().Customize(new TestConventions()))
    {
    }

    private class TestConventions : ICustomization
    {
        public void Customize(IFixture fixture)
        {
            fixture.Customize<MyClass>(c => c.With(x => x.IsActive, true));
        }
    }
}

答案 1 :(得分:0)

谢谢你,尼科斯(Nikos)。这是非常有用的。只是一个小小的更新,现在过了一段时间,在对基本构造函数进行了一些小的更改之后又有了几个版本,上面的那个现在已经过时了。它应该看起来像这样:

    private static readonly Func<IFixture> fixtureFactory = () =>
    {
        return new Fixture().Customize(new TestConventions());
    };

    public TestConventionsAttribute()
        : base(fixtureFactory)
    {
    }

    private class TestConventions : ICustomization
    {
       public void Customize(IFixture fixture)
       {
          fixture.Customize<MyClass>(c => c.With(x => x.IsActive, true));
       }
    }