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

4

我对Xunit和AutoFixture都不熟悉,现在需要编写一个理论模型,大概长这样:

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

我的类看起来像:

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

这会导致AutoFixture为每个属性创建一个具有随机值的项目列表。这很棒,但我希望IsActive属性始终为true。
我可以在每个测试开始时将其设置为true,但我猜想有更聪明的方法。我查看了InlineDataClassDataPropertyData,甚至是Inject(),但似乎没有完全合适的。
我该如何改进这个问题?
2个回答

7
这是一个做法:

以下是一种方法:

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));
        }
    }
}

2

谢谢你,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));
       }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接