using System;
using System.Reflection;
using AutoFixture;
using AutoFixture.Kernel;
using AutoFixture.Xunit2;
using Elsa.Testing.Shared.AutoFixture.SpecimenBuilders;
namespace Elsa.Testing.Shared.AutoFixture.Attributes
{
///
/// Customizes the parameter so that it creates an
/// using Moq. That mock service provider gets services by resolving them from Autofixture.
///
///
public class AutofixtureServiceProviderAttribute : CustomizeAttribute
{
public override ICustomization GetCustomization(ParameterInfo parameter)
=> new AutofixtureServiceProviderCustomization(parameter);
class AutofixtureServiceProviderCustomization : ICustomization
{
readonly ParameterInfo parameter;
public void Customize(IFixture fixture)
{
fixture.Customizations.Insert(0, GetSpecimenBuilder());
}
ISpecimenBuilder GetSpecimenBuilder()
{
var paramSpec = new ParameterSpecification(parameter.ParameterType, parameter.Name);
var specimenBuilder = new AutofixtureServiceProviderSpecimenBuilder();
return new FilteringSpecimenBuilder(specimenBuilder, paramSpec);
}
public AutofixtureServiceProviderCustomization(ParameterInfo parameter)
{
this.parameter = parameter;
}
}
}
}