Skip to content

Commit a8da307

Browse files
committed
Add global customizations for AutoFixture #7
Prevent the creation of complex object graphs and the population of auto properties.
1 parent 005aee5 commit a8da307

File tree

5 files changed

+72
-33
lines changed

5 files changed

+72
-33
lines changed

src/AutoTest.ArgumentNullException/ArgumentNullExceptionFixture.cs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
using AutoTest.ArgNullEx.Filter;
99
using AutoTest.ArgNullEx.Framework;
1010
using Ploeh.AutoFixture;
11-
using Ploeh.AutoFixture.Kernel;
1211

1312
/// <summary>
1413
/// A custom builder to generate the parameter specimens to execute methods to ensure they correctly throw <see cref="ArgumentNullException"/> errors.
@@ -53,28 +52,28 @@ public ArgumentNullExceptionFixture(Assembly assemblyUnderTest)
5352
/// Initializes a new instance of the <see cref="ArgumentNullExceptionFixture" /> class.
5453
/// </summary>
5554
/// <param name="assemblyUnderTest">The assembly under test.</param>
56-
/// <param name="builder">The specimen builder.</param>
57-
public ArgumentNullExceptionFixture(Assembly assemblyUnderTest, ISpecimenBuilder builder)
58-
: this(assemblyUnderTest, builder, DiscoverFilters())
55+
/// <param name="fixture">The specimen fixture.</param>
56+
public ArgumentNullExceptionFixture(Assembly assemblyUnderTest, IFixture fixture)
57+
: this(assemblyUnderTest, fixture, DiscoverFilters())
5958
{
6059
}
6160

6261
/// <summary>
6362
/// Initializes a new instance of the <see cref="ArgumentNullExceptionFixture" /> class.
6463
/// </summary>
6564
/// <param name="assemblyUnderTest">The assembly under test.</param>
66-
/// <param name="builder">The specimen builder.</param>
65+
/// <param name="fixture">The specimen fixture.</param>
6766
/// <param name="filters">The list of filters.</param>
68-
public ArgumentNullExceptionFixture(Assembly assemblyUnderTest, ISpecimenBuilder builder, List<IFilter> filters)
69-
: this(assemblyUnderTest, new SpecimenProvider(builder), filters)
67+
public ArgumentNullExceptionFixture(Assembly assemblyUnderTest, IFixture fixture, List<IFilter> filters)
68+
: this(assemblyUnderTest, new SpecimenProvider(fixture), filters)
7069
{
7170
}
7271

7372
/// <summary>
7473
/// Initializes a new instance of the <see cref="ArgumentNullExceptionFixture" /> class.
7574
/// </summary>
7675
/// <param name="assemblyUnderTest">The assembly under test.</param>
77-
/// <param name="specimenProvider">The builder.</param>
76+
/// <param name="specimenProvider">The specimen provider.</param>
7877
/// <param name="filters">The list of filters.</param>
7978
internal ArgumentNullExceptionFixture(Assembly assemblyUnderTest, ISpecimenProvider specimenProvider, List<IFilter> filters)
8079
{

src/AutoTest.ArgumentNullException/SpecimenProvider.cs

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
{
33
using System;
44
using System.Collections.Generic;
5+
using System.Linq;
56
using System.Reflection;
7+
using Ploeh.AutoFixture;
68
using Ploeh.AutoFixture.Kernel;
79

810
/// <summary>
@@ -18,13 +20,14 @@ internal class SpecimenProvider : ISpecimenProvider
1820
/// <summary>
1921
/// Initializes a new instance of the <see cref="SpecimenProvider"/> class.
2022
/// </summary>
21-
/// <param name="builder">The specimen builder.</param>
22-
public SpecimenProvider(ISpecimenBuilder builder)
23+
/// <param name="fixture">The specimen fixture.</param>
24+
public SpecimenProvider(IFixture fixture)
2325
{
24-
if (builder == null)
25-
throw new ArgumentNullException("builder");
26+
if (fixture == null)
27+
throw new ArgumentNullException("fixture");
2628

27-
_builder = builder;
29+
_builder = fixture;
30+
GlobalCustomizations(fixture);
2831
}
2932

3033
/// <summary>
@@ -89,6 +92,26 @@ object ISpecimenProvider.CreateInstance(Type type)
8992
return Resolve(type);
9093
}
9194

95+
/// <summary>
96+
/// Added the global customizations to the <paramref name="fixture"/>.
97+
/// </summary>
98+
/// <param name="fixture">The test fixture.</param>
99+
private static void GlobalCustomizations(IFixture fixture)
100+
{
101+
if (fixture == null)
102+
throw new ArgumentNullException("fixture");
103+
104+
// Don't need to create complex graphs, just need objects.
105+
var throwingRecursionBehavior = fixture.Behaviors.OfType<ThrowingRecursionBehavior>().SingleOrDefault();
106+
if (throwingRecursionBehavior != null)
107+
{
108+
fixture.Behaviors.Remove(throwingRecursionBehavior);
109+
fixture.Behaviors.Add(new OmitOnRecursionBehavior());
110+
}
111+
112+
fixture.OmitAutoProperties = true;
113+
}
114+
92115
/// <summary>
93116
/// Resolves the <paramref name="parameter"/> specimen.
94117
/// </summary>

src/Tests/AutoTest.ArgumentNullException.Tests/AutoFixtureCustomizations.cs

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,6 @@ private static ParameterInfo GetParameterInfo(object unused = null)
3434

3535
void ICustomization.Customize(IFixture fixture)
3636
{
37-
var throwingRecursionBehavior = fixture.Behaviors.OfType<ThrowingRecursionBehavior>().SingleOrDefault();
38-
if (throwingRecursionBehavior != null)
39-
{
40-
fixture.Behaviors.Remove(throwingRecursionBehavior);
41-
fixture.Behaviors.Add(new OmitOnRecursionBehavior());
42-
}
43-
4437
fixture.Inject(ParameterInfo);
4538
fixture.Customize<CatchInfo>(
4639
composer => composer.FromFactory(

src/Tests/AutoTest.ArgumentNullException.Tests/SpecimenProviderShould.cs

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,46 @@ public class SpecimenProviderShould
1414
{
1515
[Theory, AutoMock]
1616
internal void InitialiseBuilder(
17-
IFixture builder,
17+
IFixture fixture,
1818
SpecimenProvider sut)
1919
{
2020
// Act
21-
Assert.Same(builder, sut.Builder);
21+
Assert.Same(fixture, sut.Builder);
22+
}
23+
24+
[Theory, AutoMock]
25+
internal void AddGlobalCustomizations(
26+
IFixture fixture,
27+
SpecimenProvider sut)
28+
{
29+
// Act/Assert
30+
Assert.Same(fixture, sut.Builder);
31+
Assert.Empty(fixture.Behaviors.OfType<ThrowingRecursionBehavior>());
32+
Assert.Equal(1, fixture.Behaviors.OfType<OmitOnRecursionBehavior>().Count());
33+
Assert.True(fixture.OmitAutoProperties);
34+
}
35+
36+
[Theory, AutoMock]
37+
internal void AddGlobalCustomizationsIsIdempotent(
38+
IFixture fixture)
39+
{
40+
// Arrange
41+
var throwingRecursionBehavior = fixture.Behaviors.OfType<ThrowingRecursionBehavior>().SingleOrDefault();
42+
if (throwingRecursionBehavior != null)
43+
{
44+
fixture.Behaviors.Remove(throwingRecursionBehavior);
45+
fixture.Behaviors.Add(new OmitOnRecursionBehavior());
46+
}
47+
Assert.False(fixture.OmitAutoProperties);
48+
49+
// Act
50+
var sut = new SpecimenProvider(fixture);
51+
52+
// Assert
53+
Assert.Same(fixture, sut.Builder);
54+
Assert.Empty(fixture.Behaviors.OfType<ThrowingRecursionBehavior>());
55+
Assert.Equal(1, fixture.Behaviors.OfType<OmitOnRecursionBehavior>().Count());
56+
Assert.True(fixture.OmitAutoProperties);
2257
}
2358

2459
[Theory, AutoMock]

src/Tests/AutoTest.ExampleLibrary.Tests/RequiresArgNullExAutoMoqAttribute.cs

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
namespace AutoTest.ExampleLibrary
22
{
33
using System;
4-
using System.Linq;
54
using System.Reflection;
65
using AutoTest.ArgNullEx;
76
using AutoTest.ArgNullEx.Xunit;
@@ -31,16 +30,6 @@ private static IArgumentNullExceptionFixture CreateFixture(Assembly assemblyUnde
3130
{
3231
var fixture = new Fixture().Customize(new AutoMoqCustomization());
3332

34-
var throwingRecursionBehavior = fixture.Behaviors.OfType<ThrowingRecursionBehavior>().SingleOrDefault();
35-
if (throwingRecursionBehavior != null)
36-
{
37-
fixture.Behaviors.Remove(throwingRecursionBehavior);
38-
fixture.Behaviors.Add(new OmitOnRecursionBehavior());
39-
}
40-
41-
// Don't need to create complex graphs, just need objects.
42-
fixture.OmitAutoProperties = true;
43-
4433
return new ArgumentNullExceptionFixture(assemblyUnderTest, fixture)
4534
.ExcludeType(typeof(ComplexGenericMethods)); // Exclude until it can be tested.
4635
}

0 commit comments

Comments
 (0)