madstoustrup
1/9/2014 - 4:11 PM

AutoFixture strategy for invoking Factory Methods with most parameters based on Twitter discussion on https://twitter.com/madstt/status/4208

AutoFixture strategy for invoking Factory Methods with most parameters based on Twitter discussion on https://twitter.com/madstt/status/420850414641090560

internal class GreedyFactoryMethodQuery : IMethodQuery
{
    public IEnumerable<IMethod> SelectMethods(Type type)
    {
        if (type == null)
            throw new ArgumentNullException("type");

        return from mi in type.GetMethods(
                    BindingFlags.Static | BindingFlags.Public)
                where mi.ReturnType == type
                let parameters = mi.GetParameters()
                orderby parameters.Length descending
                select new StaticMethod(mi) as IMethod;
    }
}

public class ATypeWithFactoryMethods
{
    private ATypeWithFactoryMethods()
    {
    }

    public static ATypeWithFactoryMethods Create()
    {
        return new ATypeWithFactoryMethods();
    }

    public static ATypeWithFactoryMethods Create(object argument)
    {
        return new ATypeWithFactoryMethods();
    }
}

[Fact]
public void Test()
{
    var fixture = new Fixture();

    fixture.Customizations.Add(
        new MethodInvoker(
            new GreedyFactoryMethodQuery()));

    var result = fixture.Create<ATypeWithFactoryMethods>();
    // -> AutoFixture invokes the static Factory Method with most parameters.
}