AutoFixture全局注册类型

时间:2015-09-08 09:24:49

标签: c# autofixture

我在这个例子中使用AutoFixture来实现包含Mongo ObjectId的对象,就像这样

Fixture fixture = new Fixture();
fixture.Register(ObjectId.GenerateNewId);

但我正在为每次测试做这件事。是否有可能以某种方式为所有测试注册这个全球?

3 个答案:

答案 0 :(得分:6)

没有办法全球(或静态)。

我通常做的是创建一个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)
{

}

答案 1 :(得分:1)

我按照@drcastro的建议创建了一个约定类,但我最终创建了一个TestBase类,我在Unit测试类中继承了该类

  public class TestBase
    {
        public IFixture GenerateNewFixture()
        {
            return new Fixture().Customize(new AutoFixtureConventions());
        }
    }

 internal class AutoFixtureConventions : CompositeCustomization
    {
        public AutoFixtureConventions() :
            base(
                new MongoObjectIdCustomization())
        {

        }

        private class MongoObjectIdCustomization : ICustomization
        {
            public void Customize(IFixture fixture)
            {
                fixture.Register(ObjectId.GenerateNewId);
            }
        }
    }

答案 2 :(得分:0)

我通过注册ISpecimenBuilder来解决此问题,因为我需要在与PropertyInfo有关的某些条件上进行匹配。

private class MongoObjectIdSpecimenBuilder : ISpecimenBuilder
    {
        public object Create(object request, ISpecimenContext context)
        {
            if (request is PropertyInfo info
                && info.PropertyType == typeof(ObjectId)
                && ...)
                return ObjectId.GenerateNewId().ToString();
            return new NoSpecimen();
        }
    }

// register the builder
AutoFixture.Customizations.Add(new MongoObjectIdSpecimenBuilder());