Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ Prior to v2.0 this library was known as NTestDataBuilder.
}
}

Note that overriding the BuildObject is optional. It can be useful to do this if you want full control over how your object is constructed, for example if you want to use a particular constructor. If you don't choose to override this method then Dossier will create the object for you.

3. Use the builder in a test, e.g.

Expand Down
24 changes: 3 additions & 21 deletions TestStack.Dossier.Tests/BuildListTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
using TestStack.Dossier.DataSources.Generators;
using TestStack.Dossier.Lists;
using TestStack.Dossier.Tests.Builders;
using TestStack.Dossier.Tests.Entities;
using TestStack.Dossier.Tests.Stubs.Entities;
using Xunit;

namespace TestStack.Dossier.Tests
Expand Down Expand Up @@ -70,33 +70,15 @@ public void GivenListOfBuilders_WhenCallingBuildListExplicitly_ThenAListOfUnique

var entities = builders.BuildList();

entities[0].ShouldNotBe(entities[1]);
entities[0].ShouldNotBe(entities[2]);
entities[0].ShouldNotBe(entities[3]);
entities[0].ShouldNotBe(entities[4]);
entities[1].ShouldNotBe(entities[2]);
entities[1].ShouldNotBe(entities[3]);
entities[1].ShouldNotBe(entities[4]);
entities[2].ShouldNotBe(entities[3]);
entities[2].ShouldNotBe(entities[4]);
entities[3].ShouldNotBe(entities[4]);
entities.ShouldBeUnique();
}

[Fact]
public void GivenListOfBuilders_WhenCallingBuildListImplicitly_ThenAListOfUniqueEntitiesShouldBeReturned()
{
List<Customer> entities = BasicCustomerBuilder.CreateListOfSize(5);

entities[0].ShouldNotBe(entities[1]);
entities[0].ShouldNotBe(entities[2]);
entities[0].ShouldNotBe(entities[3]);
entities[0].ShouldNotBe(entities[4]);
entities[1].ShouldNotBe(entities[2]);
entities[1].ShouldNotBe(entities[3]);
entities[1].ShouldNotBe(entities[4]);
entities[2].ShouldNotBe(entities[3]);
entities[2].ShouldNotBe(entities[4]);
entities[3].ShouldNotBe(entities[4]);
entities.ShouldBeUnique();
}

[Fact]
Expand Down
16 changes: 15 additions & 1 deletion TestStack.Dossier.Tests/BuildTests.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using Shouldly;
using TestStack.Dossier.Tests.Builders;
using TestStack.Dossier.Tests.Entities;
using TestStack.Dossier.Tests.Stubs.Entities;
using Xunit;

namespace TestStack.Dossier.Tests
Expand Down Expand Up @@ -80,5 +80,19 @@ public void GivenBuilder_WhenCallingSetImplicitly_ShouldOverrideValues()
customer.LastName.ShouldBe("Lanningham");
customer.YearJoined.ShouldBe(2014);
}

[Fact]
public void GivenBuilderUsingConstructorReflection_WhenCallingBuildExplicitly_ShouldOverrideValues()
{
Customer customer = new AutoConstructorCustomerBuilder()
.WithFirstName("Bruce")
.WithLastName("Wayne")
.WhoJoinedIn(2012)
.Build();

customer.FirstName.ShouldBe("Bruce");
customer.LastName.ShouldBe("Wayne");
customer.YearJoined.ShouldBe(2012);
}
}
}
171 changes: 171 additions & 0 deletions TestStack.Dossier.Tests/BuilderBuildListTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Shouldly;
using TestStack.Dossier.DataSources.Generators;
using TestStack.Dossier.Lists;
using TestStack.Dossier.Tests.Builders;
using TestStack.Dossier.Tests.Stubs.ViewModels;
using Xunit;

namespace TestStack.Dossier.Tests
{
public class BuilderBuildListTests
{
private DateTime _enrollmentDate = new DateTime(2004, 9, 9);

[Fact]
public void GivenANormalBuilderInstance_WhenCallingIsListBuilderProxy_ThenReturnFalse()
{
var builder = Builder<StudentViewModel>.CreateNew();

builder.IsListBuilderProxy().ShouldBe(false);
}

[Fact]
public void GivenAListBuilderProxyInstance_WhenCallingIsListBuilderProxy_ThenReturnTrue()
{
var builder = Builder<StudentViewModel>.CreateListOfSize(1).TheFirst(1);

builder.IsListBuilderProxy().ShouldBe(true);
}

[Fact]
public void GivenListOfBuilders_WhenCallingBuildListExplicitly_ThenAListOfEntitiesOfTheRightSizeShouldBeReturned()
{
var builders = Builder<StudentViewModel>.CreateListOfSize(5);

var entities = builders.BuildList();

entities.Count.ShouldBe(5);
}

[Fact]
public void GivenListOfBuilders_WhenCallingBuildListImplicitly_ThenAListOfEntitiesOfTheRightSizeShouldBeReturned()
{
List<StudentViewModel> entities = Builder<StudentViewModel>.CreateListOfSize(5);

entities.Count.ShouldBe(5);
}

[Fact]
public void GivenListOfBuilders_WhenCallingBuildListExplicitly_ThenAListOfEntitiesOfTheRightTypeShouldBeReturned()
{
var builders = Builder<StudentViewModel>.CreateListOfSize(5);

var entities = builders.BuildList();

entities.ShouldBeAssignableTo<IList<StudentViewModel>>();
}

[Fact]
public void GivenListOfBuilders_WhenCallingBuildListImplicitly_ThenAListOfEntitiesOfTheRightTypeShouldBeReturned()
{
List<StudentViewModel> entities = Builder<StudentViewModel>.CreateListOfSize(5);

entities.ShouldBeAssignableTo<IList<StudentViewModel>>();
}

[Fact]
public void GivenListOfBuilders_WhenCallingBuildListExplicitly_ThenAListOfUniqueEntitiesShouldBeReturned()
{
var builders = Builder<StudentViewModel>.CreateListOfSize(5);

var entities = builders.BuildList();

entities.ShouldBeUnique();
}

[Fact]
public void GivenListOfBuilders_WhenCallingBuildListImplicitly_ThenAListOfUniqueEntitiesShouldBeReturned()
{
List<StudentViewModel> entities = Builder<StudentViewModel>.CreateListOfSize(5);

entities.ShouldBeUnique();
}

[Fact]
public void GivenListOfBuildersWithCustomisation_WhenBuildingEntitiesExplicitly_ThenTheCustomisationShouldTakeEffect()
{
var generator = new SequentialGenerator(0, 100);
var list = StudentViewModelBuilder.CreateListOfSize(3)
.All().With(b => b.WithFirstName(generator.Generate().ToString()));

var data = list.BuildList();

data.Select(c => c.FirstName).ToArray()
.ShouldBe(new[] { "0", "1", "2" });
}

[Fact]
public void GivenListOfBuildersWithCustomisation_WhenBuildingEntitiesImplicitly_ThenTheCustomisationShouldTakeEffect()
{
var generator = new SequentialGenerator(0, 100);

List<StudentViewModel> data = StudentViewModelBuilder.CreateListOfSize(3)
.All().With(b => b.WithFirstName(generator.Generate().ToString()));

data.Select(c => c.FirstName).ToArray()
.ShouldBe(new[] { "0", "1", "2" });
}

[Fact]
public void GivenListOfBuildersWithARangeOfCustomisationMethods_WhenBuildingEntitiesExplicitly_ThenThenTheListIsBuiltAndModifiedCorrectly()
{
var i = 0;
var studentViewModels = StudentViewModelBuilder.CreateListOfSize(5)
.TheFirst(1).WithFirstName("First")
.TheNext(1).WithLastName("Next Last")
.TheLast(1).WithLastName("Last Last")
.ThePrevious(2).With(b => b.WithLastName("last" + (++i).ToString()))
.All().WhoEntrolledIn(_enrollmentDate)
.BuildList();

studentViewModels.ShouldBeAssignableTo<IList<StudentViewModel>>();
studentViewModels.Count.ShouldBe(5);
studentViewModels[0].FirstName.ShouldBe("First");
studentViewModels[1].LastName.ShouldBe("Next Last");
studentViewModels[2].LastName.ShouldBe("last1");
studentViewModels[3].LastName.ShouldBe("last2");
studentViewModels[4].LastName.ShouldBe("Last Last");
studentViewModels.ShouldAllBe(c => c.EnrollmentDate == _enrollmentDate);
}

[Fact]
public void GivenListOfBuildersWithARangeOfCustomisationMethods_WhenBuildingEntitiesImplicitly_ThenThenTheListIsBuiltAndModifiedCorrectly()
{
var i = 0;
List<StudentViewModel> studentViewModels = StudentViewModelBuilder.CreateListOfSize(5)
.TheFirst(1).WithFirstName("First")
.TheNext(1).WithLastName("Next Last")
.TheLast(1).WithLastName("Last Last")
.ThePrevious(2).With(b => b.WithLastName("last" + (++i).ToString()))
.All().WhoEntrolledIn(_enrollmentDate);

studentViewModels.ShouldBeAssignableTo<IList<StudentViewModel>>();
studentViewModels.Count.ShouldBe(5);
studentViewModels[0].FirstName.ShouldBe("First");
studentViewModels[1].LastName.ShouldBe("Next Last");
studentViewModels[2].LastName.ShouldBe("last1");
studentViewModels[3].LastName.ShouldBe("last2");
studentViewModels[4].LastName.ShouldBe("Last Last");
studentViewModels.ShouldAllBe(c => c.EnrollmentDate == _enrollmentDate);
}

[Fact]
public void WhenBuildingEntitiesExplicitly_ThenTheAnonymousValueFixtureIsSharedAcrossBuilders()
{
var studentViewModels = StudentViewModelBuilder.CreateListOfSize(5).BuildList();

studentViewModels.Select(x => x.Grade).ShouldBeUnique();
}

[Fact]
public void WhenBuildingEntitiesImplicitly_ThenTheAnonymousValueFixtureIsSharedAcrossBuilders()
{
List<StudentViewModel> studentViewModels = StudentViewModelBuilder.CreateListOfSize(5);

studentViewModels.Select(x => x.Grade).ShouldBeUnique();
}
}
}
72 changes: 72 additions & 0 deletions TestStack.Dossier.Tests/BuilderBuildTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
using System;
using Shouldly;
using TestStack.Dossier.Tests.Builders;
using TestStack.Dossier.Tests.Stubs.Entities;
using TestStack.Dossier.Tests.Stubs.ViewModels;
using Xunit;

namespace TestStack.Dossier.Tests
{
public class BuilderBuildTests
{
[Fact]
public void GivenBasicBuilder_WhenCallingBuildExplicitly_ThenReturnAnObject()
{
var builder = Builder<Customer>.CreateNew();

var customer = builder.Build();

customer.ShouldBeOfType<Customer>();
}

[Fact]
public void GivenBuilder_WhenCallingSetExplicitly_ShouldOverrideValues()
{
var builder = Builder<Customer>.CreateNew()
.Set(x => x.FirstName, "Pi")
.Set(x => x.LastName, "Lanningham")
.Set(x => x.YearJoined, 2014);

var customer = builder.Build();

customer.FirstName.ShouldBe("Pi");
customer.LastName.ShouldBe("Lanningham");
customer.YearJoined.ShouldBe(2014);
}

[Fact]
public void GivenBasicBuilder_WhenCallingBuildImplicitly_ThenReturnAnObject()
{
Customer customer = Builder<Customer>.CreateNew();

customer.ShouldBeOfType<Customer>();
}

[Fact]
public void GivenBuilder_WhenCallingSetImplicitly_ShouldOverrideValues()
{
Customer customer = Builder<Customer>.CreateNew()
.Set(x => x.FirstName, "Pi")
.Set(x => x.LastName, "Lanningham")
.Set(x => x.YearJoined, 2014);

customer.FirstName.ShouldBe("Pi");
customer.LastName.ShouldBe("Lanningham");
customer.YearJoined.ShouldBe(2014);
}

[Fact]
public void GivenBuilder_WhenBuildingObjectWithCtorAndPrivateSetters_ShouldSetPrivateSetters()
{
var id = Guid.NewGuid();
InstructorViewModel instructor = Builder<InstructorViewModel>.CreateNew()
.Set(x => x.FirstName, "Pi")
.Set(x => x.LastName, "Lanningham")
.Set(x => x.Id, id);

instructor.FirstName.ShouldBe("Pi");
instructor.LastName.ShouldBe("Lanningham");
instructor.Id.ShouldBe(id);
}
}
}
28 changes: 28 additions & 0 deletions TestStack.Dossier.Tests/Builders/AutoConstructorCustomerBuilder.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
using TestStack.Dossier.Factories;
using TestStack.Dossier.Tests.Stubs.Entities;

namespace TestStack.Dossier.Tests.Builders
{
class AutoConstructorCustomerBuilder : TestDataBuilder<Customer, AutoConstructorCustomerBuilder>
{
public AutoConstructorCustomerBuilder WithFirstName(string firstName)
{
return Set(x => x.FirstName, firstName);
}

public AutoConstructorCustomerBuilder WithLastName(string lastName)
{
return Set(x => x.LastName, lastName);
}

public AutoConstructorCustomerBuilder WhoJoinedIn(int year)
{
return Set(x => x.YearJoined, year);
}

protected override Customer BuildObject()
{
return BuildUsing<ConstructorFactory>();
}
}
}
2 changes: 1 addition & 1 deletion TestStack.Dossier.Tests/Builders/BasicCustomerBuilder.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using System;
using System.Linq.Expressions;
using TestStack.Dossier.Tests.Entities;
using TestStack.Dossier.Tests.Stubs.Entities;

namespace TestStack.Dossier.Tests.Builders
{
Expand Down
2 changes: 1 addition & 1 deletion TestStack.Dossier.Tests/Builders/CustomerBuilder.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using TestStack.Dossier.Tests.Entities;
using TestStack.Dossier.Tests.Stubs.Entities;

namespace TestStack.Dossier.Tests.Builders
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using System;
using NSubstitute;
using TestStack.Dossier.Tests.Entities;
using TestStack.Dossier.Tests.Stubs.Entities;

namespace TestStack.Dossier.Tests.Builders
{
Expand Down
Loading