我在这个例子中使用AutoFixture来实现包含Mongo ObjectId的对象,就像这样
Fixture fixture = new Fixture(); fixture.Register(ObjectId.GenerateNewId);
但我每次测试都会这样做.是否有可能以某种方式为所有测试注册这个全球?
解决方法
全局(或静态)无法做到这一点.
我通常做的是创建一个TestConventions类,其中包含我想要应用于每个测试的所有自定义.
internal class TestConventions : CompositeCustomization { public TestConventions() : base( new MongoObjectIdCustomization()) { } private class MongoObjectIdCustomization : ICustomization { public void Customize(IFixture fixture) { fixture.Register(ObjectId.GenerateNewId); } } }
然后我将这些约定应用于每个测试:
var fixture = new Fixture().Customize(new TestConventions());
如果您使用的是AutoFixture.XUnit2(或AutoFixture.NUnit)插件,则可以通过定义导入测试约定的属性来减少此样板:
public class MyProjectAutoDataAttribute : AutoDataAttribute { public MyProjectAutoDataAttribute() : base( new Fixture().Customize(new TestConventions())) { } }
然后将其应用于您的测试用例:
[Theory,MyProjectAutoData] public void SomeFact(SomeClass sut) { }