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