Skip to content

Commit 72280f3

Browse files
committed
Added tests for various Factories
1 parent 37a290d commit 72280f3

File tree

8 files changed

+120
-31
lines changed

8 files changed

+120
-31
lines changed

TestStack.Dossier.Tests/BuilderBuildTests.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using Shouldly;
1+
using System;
2+
using Shouldly;
23
using TestStack.Dossier.Tests.Builders;
34
using TestStack.Dossier.Tests.Stubs.Entities;
45
using TestStack.Dossier.Tests.Stubs.ViewModels;
@@ -57,14 +58,15 @@ public void GivenBuilder_WhenCallingSetImplicitly_ShouldOverrideValues()
5758
[Fact]
5859
public void GivenBuilder_WhenBuildingObjectWithCtorAndPrivateSetters_ShouldSetPrivateSetters()
5960
{
61+
var id = Guid.NewGuid();
6062
InstructorViewModel instructor = Builder<InstructorViewModel>.CreateNew()
6163
.Set(x => x.FirstName, "Pi")
6264
.Set(x => x.LastName, "Lanningham")
63-
.Set(x => x.Id, 5);
65+
.Set(x => x.Id, id);
6466

6567
instructor.FirstName.ShouldBe("Pi");
6668
instructor.LastName.ShouldBe("Lanningham");
67-
instructor.Id.ShouldBe(5);
69+
instructor.Id.ShouldBe(id);
6870
}
6971
}
7072
}
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
using System;
2+
using Shouldly;
3+
using TestStack.Dossier.Factories;
4+
using TestStack.Dossier.Tests.Stubs.Entities;
5+
using TestStack.Dossier.Tests.Stubs.ViewModels;
6+
using Xunit;
7+
8+
namespace TestStack.Dossier.Tests.Factories
9+
{
10+
public class FactoryTests
11+
{
12+
[Fact]
13+
public void GivenAllPropertiesFactory_WhenBuilding_ThenAllPropertiesSet()
14+
{
15+
InstructorViewModel instructor = Builder<InstructorViewModel>.CreateNew(new AllPropertiesFactory());
16+
17+
// ctor properties
18+
instructor.Id.ShouldNotBe(Guid.Empty);
19+
instructor.FirstName.ShouldNotBe(null);
20+
instructor.LastName.ShouldNotBe(null);
21+
22+
// public properties
23+
instructor.Room.ShouldNotBe(null);
24+
instructor.NumberOfStudents.ShouldNotBe(0);
25+
26+
// private properties
27+
instructor.Subject.ShouldNotBe(null);
28+
instructor.YearsAtSchool.ShouldNotBe(0);
29+
}
30+
31+
[Fact]
32+
public void GivenAutoFixtureFactory_WhenBuilding_ThenOnlyConstructorAndPublicPropertiesSet()
33+
{
34+
InstructorViewModel instructor = Builder<InstructorViewModel>.CreateNew(new AutoFixtureFactory());
35+
36+
// ctor properties
37+
instructor.Id.ShouldNotBe(Guid.Empty);
38+
instructor.FirstName.ShouldNotBe(null);
39+
instructor.LastName.ShouldNotBe(null);
40+
41+
// public properties
42+
instructor.Room.ShouldNotBe(null);
43+
instructor.NumberOfStudents.ShouldNotBe(0);
44+
45+
// private properties
46+
instructor.Subject.ShouldBe(null);
47+
instructor.YearsAtSchool.ShouldBe(0);
48+
}
49+
50+
[Fact]
51+
public void GivenConstructorPropertiesFactory_WhenBuilding_ThenOnlyConstructorPropertiesSet()
52+
{
53+
InstructorViewModel instructor = Builder<InstructorViewModel>.CreateNew(new ConstructorFactory());
54+
55+
// ctor properties
56+
instructor.Id.ShouldNotBe(Guid.Empty);
57+
instructor.FirstName.ShouldNotBe(null);
58+
instructor.LastName.ShouldNotBe(null);
59+
60+
// public properties
61+
instructor.Room.ShouldBe(null);
62+
instructor.NumberOfStudents.ShouldBe(0);
63+
64+
// private properties
65+
instructor.Subject.ShouldBe(null);
66+
instructor.YearsAtSchool.ShouldBe(0);
67+
}
68+
69+
[Fact]
70+
public void GivenPublicPropertiesFactory_WhenBuilding_ThenOnlyConstructorAndPublicPropertiesSet()
71+
{
72+
InstructorViewModel instructor = Builder<InstructorViewModel>.CreateNew(new PublicPropertiesFactory());
73+
74+
// ctor properties
75+
instructor.Id.ShouldNotBe(Guid.Empty);
76+
instructor.FirstName.ShouldNotBe(null);
77+
instructor.LastName.ShouldNotBe(null);
78+
79+
// public properties
80+
instructor.Room.ShouldNotBe(null);
81+
instructor.NumberOfStudents.ShouldBeGreaterThan(0);
82+
83+
// private properties
84+
instructor.Subject.ShouldBe(null);
85+
instructor.YearsAtSchool.ShouldBe(0);
86+
}
87+
}
88+
}

TestStack.Dossier.Tests/Stubs/ViewModels/InstructorViewModel.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,16 @@ namespace TestStack.Dossier.Tests.Stubs.ViewModels
44
{
55
public class InstructorViewModel
66
{
7-
public InstructorViewModel(int id, string firstName, string lastName)
7+
public InstructorViewModel(Guid id, string firstName, string lastName)
88
{
99
Id = id;
1010
FirstName = firstName;
1111
LastName = lastName;
1212
}
1313

14-
public int Id { get; private set; }
14+
public Guid Id { get; private set; }
1515

16-
public string LastName { get; private set; }
16+
public string LastName { get; set; }
1717
public string FirstName { get; private set; }
1818

1919
public string FullName
@@ -23,8 +23,10 @@ public string FullName
2323
return FirstName + " " + LastName;
2424
}
2525
}
26-
public DateTime JoinDate { get; set; }
26+
public string Room{ get; set; }
2727

28-
public Grade Grade { get; set; }
28+
public string Subject{ get; private set; }
29+
public int YearsAtSchool { get; private set; }
30+
public int NumberOfStudents { get; set; }
2931
}
3032
}

TestStack.Dossier.Tests/TestStack.Dossier.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
<Compile Include="Builders\StudentViewModelBuilder.cs" />
6161
<Compile Include="Builders\AutoConstructorCustomerBuilder.cs" />
6262
<Compile Include="ChildBuilderTests.cs" />
63+
<Compile Include="Factories\FactoryTests.cs" />
6364
<Compile Include="Stubs\Entities\Company.cs" />
6465
<Compile Include="Stubs\Entities\Customer.cs" />
6566
<Compile Include="Stubs\Entities\CustomerClass.cs" />

TestStack.Dossier/Builder.cs

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,6 @@ namespace TestStack.Dossier
99
public class Builder<T> : TestDataBuilder<T, Builder<T>>
1010
where T : class
1111
{
12-
/// <inheritdoc />
13-
public Builder()
14-
: this(new AllPropertiesFactory())
15-
{
16-
17-
}
18-
19-
/// <inheritdoc />
20-
public Builder(IFactory factory)
21-
: base(factory) { }
22-
2312
/// <summary>
2413
/// Initialises a new Builder.
2514
/// </summary>
@@ -30,7 +19,7 @@ public static Builder<T> CreateNew(IFactory factory = null)
3019
{
3120
factory = new AllPropertiesFactory();
3221
}
33-
return new Builder<T>(factory);
22+
return new Builder<T> {Factory = factory};
3423
}
3524
}
3625
}

TestStack.Dossier/Factories/ConstructorFactory.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ namespace TestStack.Dossier.Factories
1212
public class ConstructorFactory : IFactory
1313
{
1414
/// <inheritdoc />
15-
public TObject BuildObject<TObject, TBuilder>(TestDataBuilder<TObject, TBuilder> builder)
15+
public virtual TObject BuildObject<TObject, TBuilder>(TestDataBuilder<TObject, TBuilder> builder)
1616
where TObject : class
1717
where TBuilder : TestDataBuilder<TObject, TBuilder>, new()
1818
{
Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,21 @@
1-
using Ploeh.AutoFixture;
1+
using System.Reflection;
22

33
namespace TestStack.Dossier.Factories
44
{
55
/// <summary>
66
/// Creates an instance of an object by setting all public properties but not private properties.
77
/// </summary>
8-
public class PublicPropertiesFactory : IFactory
8+
public class PublicPropertiesFactory : ConstructorFactory
99
{
1010
/// <inheritdoc />
11-
public TObject BuildObject<TObject, TBuilder>(TestDataBuilder<TObject, TBuilder> builder)
12-
where TObject : class
13-
where TBuilder : TestDataBuilder<TObject, TBuilder>, new()
11+
public override TObject BuildObject<TObject, TBuilder>(TestDataBuilder<TObject, TBuilder> builder)
1412
{
15-
var model = builder.Any.Fixture.Create<TObject>();
13+
var model = base.BuildObject(builder);
1614

1715
var properties = Reflector.GetSettablePropertiesFor<TObject>();
1816
foreach (var property in properties)
1917
{
20-
if (property.CanWrite && property.GetSetMethod().IsPublic)
18+
if (PropertySetterIsPublic(property))
2119
{
2220
var val = builder.Get(property.PropertyType, property.Name);
2321
property.SetValue(model, val, null);
@@ -26,5 +24,10 @@ public TObject BuildObject<TObject, TBuilder>(TestDataBuilder<TObject, TBuilder>
2624

2725
return model;
2826
}
27+
28+
private static bool PropertySetterIsPublic(PropertyInfo property)
29+
{
30+
return property.CanWrite && property.GetSetMethod() != null;
31+
}
2932
}
3033
}

TestStack.Dossier/TestDataBuilder.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,14 @@ public abstract class TestDataBuilder<TObject, TBuilder>
1515
where TObject : class
1616
where TBuilder : TestDataBuilder<TObject, TBuilder>, new()
1717
{
18-
private readonly IFactory _factory;
1918
private readonly Dictionary<string, object> _properties = new Dictionary<string, object>(StringComparer.InvariantCultureIgnoreCase);
2019
private ProxyBuilder<TObject> _proxyBuilder;
2120

21+
/// <summary>
22+
/// The factory used to create the instance of TObject.
23+
/// </summary>
24+
public IFactory Factory;
25+
2226
/// <summary>
2327
/// The list builder instance (if this ia a list builder proxy).
2428
/// </summary>
@@ -37,7 +41,7 @@ protected TestDataBuilder()
3741
/// </summary>
3842
protected TestDataBuilder(IFactory factory)
3943
{
40-
_factory = factory;
44+
Factory = factory;
4145
Any = new AnonymousValueFixture();
4246
}
4347

@@ -86,7 +90,7 @@ public static implicit operator List<TObject>(TestDataBuilder<TObject, TBuilder>
8690
/// <returns>The built object</returns>
8791
protected virtual TObject BuildObject()
8892
{
89-
var model = _factory.BuildObject(this);
93+
var model = Factory.BuildObject(this);
9094

9195
return model;
9296
}

0 commit comments

Comments
 (0)