Created
November 15, 2021 12:22
-
-
Save aivascu/b9c5d76b501e2bc1b53af9aae6a61746 to your computer and use it in GitHub Desktop.
AutoFixture partial postprocess composition
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[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); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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