我是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,但我猜测有一种更聪明的方法。我查看了InlineData
,ClassData
,PropertyData
,甚至Inject()
,但似乎没有任何内容。
我该如何改善这个?
答案 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));
}
}