Skip to content

Commit 7ce4bb3

Browse files
committed
Merge pull request #29 from mwhelan/master
Added implicit creation of entities for the ultimate in terseness
2 parents 902f9dc + 024e7a0 commit 7ce4bb3

File tree

6 files changed

+171
-11
lines changed

6 files changed

+171
-11
lines changed

NextVersion.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2.0.0
1+
2.1.0

README.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,26 @@ Then you either need to:
143143
* Make your builder class public
144144
* Add the following to your `AssemblyInfo.cs` file: `[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]`
145145

146+
Create Entities Implicitly
147+
--------------------------
148+
In the previous examples, you have seen how to create entities *explicitly*, by calling the `Build()` and `BuildList()` methods. For the ultimate in terseness, you can omit these methods, and Dossier will *implicitly* call them for you. The one caveat is that you must explicitly declare the variable type rather than using the `var` keyword.
149+
150+
So, to create a single entity:
151+
152+
Customer customer = new CustomerBuilder();
153+
154+
Customer customer = new CustomerBuilder()
155+
.WithFirstName("Matt")
156+
.WithLastName("Kocaj")
157+
.WhoJoinedIn(2010);
158+
159+
Or to create a list of entities:
160+
161+
List<Customer> entities = BasicCustomerBuilder.CreateListOfSize(5);
162+
163+
List<Customer> data = CustomerBuilder.CreateListOfSize(3)
164+
.All().With(b => b.WithFirstName(generator.Generate().ToString()));
165+
146166
Anonymous Values and Equivalence Classes
147167
----------------------------------------
148168

TestStack.Dossier.Tests/BuildListTests.cs

Lines changed: 84 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public void GivenAListBuilderProxyInstance_WhenCallingIsListBuilderProxy_ThenRet
2828
}
2929

3030
[Fact]
31-
public void GivenListOfBuilders_WhenCallingBuildList_ThenAListOfEntitiesOfTheRightSizeShouldBeReturned()
31+
public void GivenListOfBuilders_WhenCallingBuildListExplicitly_ThenAListOfEntitiesOfTheRightSizeShouldBeReturned()
3232
{
3333
var builders = BasicCustomerBuilder.CreateListOfSize(5);
3434

@@ -38,7 +38,15 @@ public void GivenListOfBuilders_WhenCallingBuildList_ThenAListOfEntitiesOfTheRig
3838
}
3939

4040
[Fact]
41-
public void GivenListOfBuilders_WhenCallingBuildList_ThenAListOfEntitiesOfTheRightTypeShouldBeReturned()
41+
public void GivenListOfBuilders_WhenCallingBuildListImplicitly_ThenAListOfEntitiesOfTheRightSizeShouldBeReturned()
42+
{
43+
List<Customer> entities = BasicCustomerBuilder.CreateListOfSize(5);
44+
45+
entities.Count.ShouldBe(5);
46+
}
47+
48+
[Fact]
49+
public void GivenListOfBuilders_WhenCallingBuildListExplicitly_ThenAListOfEntitiesOfTheRightTypeShouldBeReturned()
4250
{
4351
var builders = BasicCustomerBuilder.CreateListOfSize(5);
4452

@@ -48,7 +56,15 @@ public void GivenListOfBuilders_WhenCallingBuildList_ThenAListOfEntitiesOfTheRig
4856
}
4957

5058
[Fact]
51-
public void GivenListOfBuilders_WhenCallingBuildList_ThenAListOfUniqueEntitiesShouldBeReturned()
59+
public void GivenListOfBuilders_WhenCallingBuildListImplicitly_ThenAListOfEntitiesOfTheRightTypeShouldBeReturned()
60+
{
61+
List<Customer> entities = BasicCustomerBuilder.CreateListOfSize(5);
62+
63+
entities.ShouldBeAssignableTo<IList<Customer>>();
64+
}
65+
66+
[Fact]
67+
public void GivenListOfBuilders_WhenCallingBuildListExplicitly_ThenAListOfUniqueEntitiesShouldBeReturned()
5268
{
5369
var builders = BasicCustomerBuilder.CreateListOfSize(5);
5470

@@ -67,7 +83,24 @@ public void GivenListOfBuilders_WhenCallingBuildList_ThenAListOfUniqueEntitiesSh
6783
}
6884

6985
[Fact]
70-
public void GivenListOfBuildersWithCustomisation_WhenBuildingEntities_ThenTheCustomisationShouldTakeEffect()
86+
public void GivenListOfBuilders_WhenCallingBuildListImplicitly_ThenAListOfUniqueEntitiesShouldBeReturned()
87+
{
88+
List<Customer> entities = BasicCustomerBuilder.CreateListOfSize(5);
89+
90+
entities[0].ShouldNotBe(entities[1]);
91+
entities[0].ShouldNotBe(entities[2]);
92+
entities[0].ShouldNotBe(entities[3]);
93+
entities[0].ShouldNotBe(entities[4]);
94+
entities[1].ShouldNotBe(entities[2]);
95+
entities[1].ShouldNotBe(entities[3]);
96+
entities[1].ShouldNotBe(entities[4]);
97+
entities[2].ShouldNotBe(entities[3]);
98+
entities[2].ShouldNotBe(entities[4]);
99+
entities[3].ShouldNotBe(entities[4]);
100+
}
101+
102+
[Fact]
103+
public void GivenListOfBuildersWithCustomisation_WhenBuildingEntitiesExplicitly_ThenTheCustomisationShouldTakeEffect()
71104
{
72105
var generator = new SequentialGenerator(0, 100);
73106
var list = CustomerBuilder.CreateListOfSize(3)
@@ -80,7 +113,19 @@ public void GivenListOfBuildersWithCustomisation_WhenBuildingEntities_ThenTheCus
80113
}
81114

82115
[Fact]
83-
public void GivenListOfBuildersWithARangeOfCustomisationMethods_WhenBuildingEntities_ThenThenTheListIsBuiltAndModifiedCorrectly()
116+
public void GivenListOfBuildersWithCustomisation_WhenBuildingEntitiesImplicitly_ThenTheCustomisationShouldTakeEffect()
117+
{
118+
var generator = new SequentialGenerator(0, 100);
119+
120+
List<Customer> data = CustomerBuilder.CreateListOfSize(3)
121+
.All().With(b => b.WithFirstName(generator.Generate().ToString()));
122+
123+
data.Select(c => c.FirstName).ToArray()
124+
.ShouldBe(new[] { "0", "1", "2" });
125+
}
126+
127+
[Fact]
128+
public void GivenListOfBuildersWithARangeOfCustomisationMethods_WhenBuildingEntitiesExplicitly_ThenThenTheListIsBuiltAndModifiedCorrectly()
84129
{
85130
var i = 0;
86131
var customers = CustomerBuilder.CreateListOfSize(5)
@@ -102,7 +147,28 @@ public void GivenListOfBuildersWithARangeOfCustomisationMethods_WhenBuildingEnti
102147
}
103148

104149
[Fact]
105-
public void WhenBuildingEntities_ThenTheAnonymousValueFixtureIsSharedAcrossBuilders()
150+
public void GivenListOfBuildersWithARangeOfCustomisationMethods_WhenBuildingEntitiesImplicitly_ThenThenTheListIsBuiltAndModifiedCorrectly()
151+
{
152+
var i = 0;
153+
List<Customer> customers = CustomerBuilder.CreateListOfSize(5)
154+
.TheFirst(1).WithFirstName("First")
155+
.TheNext(1).WithLastName("Next Last")
156+
.TheLast(1).WithLastName("Last Last")
157+
.ThePrevious(2).With(b => b.WithLastName("last" + (++i).ToString()))
158+
.All().WhoJoinedIn(1999);
159+
160+
customers.ShouldBeAssignableTo<IList<Customer>>();
161+
customers.Count.ShouldBe(5);
162+
customers[0].FirstName.ShouldBe("First");
163+
customers[1].LastName.ShouldBe("Next Last");
164+
customers[2].LastName.ShouldBe("last1");
165+
customers[3].LastName.ShouldBe("last2");
166+
customers[4].LastName.ShouldBe("Last Last");
167+
customers.ShouldAllBe(c => c.YearJoined == 1999);
168+
}
169+
170+
[Fact]
171+
public void WhenBuildingEntitiesExplicitly_ThenTheAnonymousValueFixtureIsSharedAcrossBuilders()
106172
{
107173
var customers = CustomerBuilder.CreateListOfSize(5).BuildList();
108174

@@ -112,5 +178,17 @@ public void WhenBuildingEntities_ThenTheAnonymousValueFixtureIsSharedAcrossBuild
112178
customers[3].CustomerClass.ShouldBe(CustomerClass.Gold);
113179
customers[4].CustomerClass.ShouldBe(CustomerClass.Platinum);
114180
}
181+
182+
[Fact]
183+
public void WhenBuildingEntitiesImplicitly_ThenTheAnonymousValueFixtureIsSharedAcrossBuilders()
184+
{
185+
List<Customer> customers = CustomerBuilder.CreateListOfSize(5);
186+
187+
customers[0].CustomerClass.ShouldBe(CustomerClass.Normal);
188+
customers[1].CustomerClass.ShouldBe(CustomerClass.Bronze);
189+
customers[2].CustomerClass.ShouldBe(CustomerClass.Silver);
190+
customers[3].CustomerClass.ShouldBe(CustomerClass.Gold);
191+
customers[4].CustomerClass.ShouldBe(CustomerClass.Platinum);
192+
}
115193
}
116194
}

TestStack.Dossier.Tests/BuildTests.cs

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ namespace TestStack.Dossier.Tests
88
public class BuildTests
99
{
1010
[Fact]
11-
public void GivenBasicBuilder_WhenCallingBuild_ThenReturnAnObject()
11+
public void GivenBasicBuilder_WhenCallingBuildExplicitly_ThenReturnAnObject()
1212
{
1313
var builder = new BasicCustomerBuilder();
1414

@@ -18,7 +18,7 @@ public void GivenBasicBuilder_WhenCallingBuild_ThenReturnAnObject()
1818
}
1919

2020
[Fact]
21-
public void GivenBuilderWithMethodCalls_WhenCallingBuild_ThenReturnAnObjectWithTheConfiguredParameters()
21+
public void GivenBuilderWithMethodCalls_WhenCallingBuildExplicitly_ThenReturnAnObjectWithTheConfiguredParameters()
2222
{
2323
var builder = new CustomerBuilder()
2424
.WithFirstName("Matt")
@@ -33,7 +33,7 @@ public void GivenBuilderWithMethodCalls_WhenCallingBuild_ThenReturnAnObjectWithT
3333
}
3434

3535
[Fact]
36-
public void GivenBuilder_WhenCallingSet_ShouldOverrideValues()
36+
public void GivenBuilder_WhenCallingSetExplicitly_ShouldOverrideValues()
3737
{
3838
var builder = new CustomerBuilder()
3939
.Set(x => x.FirstName, "Pi")
@@ -46,5 +46,39 @@ public void GivenBuilder_WhenCallingSet_ShouldOverrideValues()
4646
customer.LastName.ShouldBe("Lanningham");
4747
customer.YearJoined.ShouldBe(2014);
4848
}
49+
50+
[Fact]
51+
public void GivenBasicBuilder_WhenCallingBuildImplicitly_ThenReturnAnObject()
52+
{
53+
Customer customer = new BasicCustomerBuilder();
54+
55+
customer.ShouldBeOfType<Customer>();
56+
}
57+
58+
[Fact]
59+
public void GivenBuilderWithMethodCalls_WhenCallingBuildImplicitly_ThenReturnAnObjectWithTheConfiguredParameters()
60+
{
61+
Customer customer = new CustomerBuilder()
62+
.WithFirstName("Matt")
63+
.WithLastName("Kocaj")
64+
.WhoJoinedIn(2010);
65+
66+
customer.FirstName.ShouldBe("Matt");
67+
customer.LastName.ShouldBe("Kocaj");
68+
customer.YearJoined.ShouldBe(2010);
69+
}
70+
71+
[Fact]
72+
public void GivenBuilder_WhenCallingSetImplicitly_ShouldOverrideValues()
73+
{
74+
Customer customer = new CustomerBuilder()
75+
.Set(x => x.FirstName, "Pi")
76+
.Set(x => x.LastName, "Lanningham")
77+
.Set(x => x.YearJoined, 2014);
78+
79+
customer.FirstName.ShouldBe("Pi");
80+
customer.LastName.ShouldBe("Lanningham");
81+
customer.YearJoined.ShouldBe(2014);
82+
}
4983
}
50-
}
84+
}

TestStack.Dossier/Lists/ListBuilder.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,15 @@ public IList<TObject> BuildList()
115115
return _list.Select(b => b.Build()).ToArray();
116116
}
117117

118+
/// <summary>
119+
/// Builds the list of objects with implicit conversion operator.
120+
/// </summary>
121+
/// <returns>The built object</returns>
122+
public static implicit operator List<TObject>(ListBuilder<TObject, TBuilder> builder)
123+
{
124+
return builder.BuildList().ToList();
125+
}
126+
118127
internal void Execute(IInvocation invocation)
119128
{
120129
_list.Skip(_start)

TestStack.Dossier/TestDataBuilder.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Linq;
34
using System.Linq.Expressions;
45
using TestStack.Dossier.Lists;
56

@@ -51,6 +52,24 @@ public TObject Build()
5152
return BuildObject();
5253
}
5354

55+
/// <summary>
56+
/// Builds the object with implicit conversion operator.
57+
/// </summary>
58+
/// <returns>The built object</returns>
59+
public static implicit operator TObject(TestDataBuilder<TObject, TBuilder> builder)
60+
{
61+
return builder.Build();
62+
}
63+
64+
/// <summary>
65+
/// Builds the list of objects with implicit conversion operator.
66+
/// </summary>
67+
/// <returns>The built object</returns>
68+
public static implicit operator List<TObject>(TestDataBuilder<TObject, TBuilder> builder)
69+
{
70+
return builder.ListBuilder;
71+
}
72+
5473
/// <summary>
5574
/// Build the actual object - override this and call the constructor and any other methods.
5675
/// </summary>

0 commit comments

Comments
 (0)