This isn't really related to #751 - it's a refactor of some of our test logic, to avoid bloat of semi-repeated autofixture customization attributes. By switching to a behaviour-driven model, it's possible to compose them, which means that there's no need to part-duplicate between them. It should also reduce the overall number of them, as combinations can be put together on-demand, rather than needing a new attribute of their own.
64 lines
2.5 KiB
C#
64 lines
2.5 KiB
C#
using System;
|
|
using System.Reflection;
|
|
using AutoFixture;
|
|
using AutoFixture.Kernel;
|
|
using AutoFixture.Xunit2;
|
|
using Elsa.Testing.Shared.AutoFixture.Specifications;
|
|
using Elsa.Testing.Shared.Helpers;
|
|
|
|
namespace Elsa.Testing.Shared.AutoFixture.Attributes
|
|
{
|
|
public abstract class ElsaHostBuilderBuilderCustomizeAttributeBase : CustomizeAttribute
|
|
{
|
|
public abstract Action<ElsaHostBuilderBuilder> GetBuilderCustomizer();
|
|
|
|
public override ICustomization GetCustomization(ParameterInfo parameter)
|
|
=> new ElsaHostBuilderBuilderCustomization(GetBuilderCustomizer());
|
|
|
|
class ElsaHostBuilderBuilderCustomization : ICustomization
|
|
{
|
|
readonly Action<ElsaHostBuilderBuilder> builderCustomizer;
|
|
|
|
public void Customize(IFixture fixture)
|
|
{
|
|
fixture.Behaviors.Add(new ElsaHostBuilderBuilderTransformation(builderCustomizer));
|
|
}
|
|
|
|
public ElsaHostBuilderBuilderCustomization(Action<ElsaHostBuilderBuilder> builderCustomizer)
|
|
{
|
|
this.builderCustomizer = builderCustomizer ?? throw new ArgumentNullException(nameof(builderCustomizer));
|
|
}
|
|
}
|
|
|
|
class ElsaHostBuilderBuilderTransformation : ISpecimenBuilderTransformation
|
|
{
|
|
readonly Action<ElsaHostBuilderBuilder> builderCustomizer;
|
|
|
|
public ISpecimenBuilderNode Transform(ISpecimenBuilder builder)
|
|
{
|
|
return new Postprocessor(builder, new ElsaHostBuilderBuilderCommand(builderCustomizer), new IsAnElsaHostBuilderBuilderSpec());
|
|
}
|
|
|
|
public ElsaHostBuilderBuilderTransformation(Action<ElsaHostBuilderBuilder> builderCustomizer)
|
|
{
|
|
this.builderCustomizer = builderCustomizer ?? throw new ArgumentNullException(nameof(builderCustomizer));
|
|
}
|
|
}
|
|
|
|
class ElsaHostBuilderBuilderCommand : ISpecimenCommand
|
|
{
|
|
readonly Action<ElsaHostBuilderBuilder> builderCustomizer;
|
|
|
|
public void Execute(object specimen, ISpecimenContext context)
|
|
{
|
|
var builder = (ElsaHostBuilderBuilder) specimen;
|
|
builderCustomizer(builder);
|
|
}
|
|
|
|
public ElsaHostBuilderBuilderCommand(Action<ElsaHostBuilderBuilder> builderCustomizer)
|
|
{
|
|
this.builderCustomizer = builderCustomizer ?? throw new ArgumentNullException(nameof(builderCustomizer));
|
|
}
|
|
}
|
|
}
|
|
} |