Skip to content

Instantly share code, notes, and snippets.

@aivascu
Created November 15, 2021 12:22
Show Gist options
  • Save aivascu/b9c5d76b501e2bc1b53af9aae6a61746 to your computer and use it in GitHub Desktop.
Save aivascu/b9c5d76b501e2bc1b53af9aae6a61746 to your computer and use it in GitHub Desktop.
AutoFixture partial postprocess composition
public class Order
{
public decimal TaxPercent { get; set; }
public decimal DiscountPercent { get; set; }
}
public class ChristmasOrderTax : IPartialPostprocessComposer<Order>
{
public IPostprocessComposer<Order> Compose(IPostprocessComposer<Order> composer)
{
return composer.With(x => x.TaxPercent, (int x) => 200);
}
}
public class ChristmasOrderDiscount : IPartialPostprocessComposer<Order>
{
public IPostprocessComposer<Order> Compose(IPostprocessComposer<Order> composer)
{
return composer.With(x => x.DiscountPercent, (int x) => 20);
}
}
[Fact]
public void OrdersHaveChristmasTaxAndDiscount()
{
// Arrange
var fixture = new Fixture();
fixture.Inject(5);
fixture.Customize<Order>(c => c.Using(new ChristmasOrderTax(), new ChristmasOrderDiscount()));
// Act
var orders = fixture.CreateMany<Order>();
// Assert
orders.Should().OnlyContain(x => x.TaxPercent == 200 && x.DiscountPercent == 20);
}
public interface IPartialPostprocessComposer<T>
{
IPostprocessComposer<T> Compose(IPostprocessComposer<T> composer);
}
public static class ComposerExtensions
{
public static IPostprocessComposer<T> Using<T>(this IPostprocessComposer<T> source, IPartialPostprocessComposer<T> composer)
{
return composer.Compose(source);
}
public static IPostprocessComposer<T> Using<T>(this IPostprocessComposer<T> source, params IPartialPostprocessComposer<T>[] composers)
{
return new CompositePartialPostprocessComposer<T>(composers).Compose(source);
}
}
public class CompositePartialPostprocessComposer<T> : IPartialPostprocessComposer<T>
{
private readonly IEnumerable<IPartialPostprocessComposer<T>> composers;
public CompositePartialPostprocessComposer(IEnumerable<IPartialPostprocessComposer<T>> composers)
{
this.composers = composers ?? throw new ArgumentNullException(nameof(composers));
}
public CompositePartialPostprocessComposer(params IPartialPostprocessComposer<T>[] composers)
: this(composers.AsEnumerable())
{
}
public IPostprocessComposer<T> Compose(IPostprocessComposer<T> composer)
=> this.composers.Aggregate(composer, (x, c) => x.Using(c));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment