繁体   English   中英

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

[英]Using AutoFixture to set properties on a collection as data for an Xunit theory

我是 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()但似乎没有什么合适的。

我该如何改进?

这是执行此操作的一种方法:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM