Skip to content

Commit

Permalink
Added tests for various Factories
Browse files Browse the repository at this point in the history
  • Loading branch information
mwhelan committed May 3, 2015
1 parent 37a290d commit 72280f3
Show file tree
Hide file tree
Showing 8 changed files with 120 additions and 31 deletions.
8 changes: 5 additions & 3 deletions TestStack.Dossier.Tests/BuilderBuildTests.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Shouldly;
using System;
using Shouldly;
using TestStack.Dossier.Tests.Builders;
using TestStack.Dossier.Tests.Stubs.Entities;
using TestStack.Dossier.Tests.Stubs.ViewModels;
Expand Down Expand Up @@ -57,14 +58,15 @@ public void GivenBuilder_WhenCallingSetImplicitly_ShouldOverrideValues()
[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, 5);
.Set(x => x.Id, id);

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

namespace TestStack.Dossier.Tests.Factories
{
public class FactoryTests
{
[Fact]
public void GivenAllPropertiesFactory_WhenBuilding_ThenAllPropertiesSet()
{
InstructorViewModel instructor = Builder<InstructorViewModel>.CreateNew(new AllPropertiesFactory());

// ctor properties
instructor.Id.ShouldNotBe(Guid.Empty);
instructor.FirstName.ShouldNotBe(null);
instructor.LastName.ShouldNotBe(null);

// public properties
instructor.Room.ShouldNotBe(null);
instructor.NumberOfStudents.ShouldNotBe(0);

// private properties
instructor.Subject.ShouldNotBe(null);
instructor.YearsAtSchool.ShouldNotBe(0);
}

[Fact]
public void GivenAutoFixtureFactory_WhenBuilding_ThenOnlyConstructorAndPublicPropertiesSet()
{
InstructorViewModel instructor = Builder<InstructorViewModel>.CreateNew(new AutoFixtureFactory());

// ctor properties
instructor.Id.ShouldNotBe(Guid.Empty);
instructor.FirstName.ShouldNotBe(null);
instructor.LastName.ShouldNotBe(null);

// public properties
instructor.Room.ShouldNotBe(null);
instructor.NumberOfStudents.ShouldNotBe(0);

// private properties
instructor.Subject.ShouldBe(null);
instructor.YearsAtSchool.ShouldBe(0);
}

[Fact]
public void GivenConstructorPropertiesFactory_WhenBuilding_ThenOnlyConstructorPropertiesSet()
{
InstructorViewModel instructor = Builder<InstructorViewModel>.CreateNew(new ConstructorFactory());

// ctor properties
instructor.Id.ShouldNotBe(Guid.Empty);
instructor.FirstName.ShouldNotBe(null);
instructor.LastName.ShouldNotBe(null);

// public properties
instructor.Room.ShouldBe(null);
instructor.NumberOfStudents.ShouldBe(0);

// private properties
instructor.Subject.ShouldBe(null);
instructor.YearsAtSchool.ShouldBe(0);
}

[Fact]
public void GivenPublicPropertiesFactory_WhenBuilding_ThenOnlyConstructorAndPublicPropertiesSet()
{
InstructorViewModel instructor = Builder<InstructorViewModel>.CreateNew(new PublicPropertiesFactory());

// ctor properties
instructor.Id.ShouldNotBe(Guid.Empty);
instructor.FirstName.ShouldNotBe(null);
instructor.LastName.ShouldNotBe(null);

// public properties
instructor.Room.ShouldNotBe(null);
instructor.NumberOfStudents.ShouldBeGreaterThan(0);

// private properties
instructor.Subject.ShouldBe(null);
instructor.YearsAtSchool.ShouldBe(0);
}
}
}
12 changes: 7 additions & 5 deletions TestStack.Dossier.Tests/Stubs/ViewModels/InstructorViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,16 @@ namespace TestStack.Dossier.Tests.Stubs.ViewModels
{
public class InstructorViewModel
{
public InstructorViewModel(int id, string firstName, string lastName)
public InstructorViewModel(Guid id, string firstName, string lastName)
{
Id = id;
FirstName = firstName;
LastName = lastName;
}

public int Id { get; private set; }
public Guid Id { get; private set; }

public string LastName { get; private set; }
public string LastName { get; set; }
public string FirstName { get; private set; }

public string FullName
Expand All @@ -23,8 +23,10 @@ public string FullName
return FirstName + " " + LastName;
}
}
public DateTime JoinDate { get; set; }
public string Room{ get; set; }

public Grade Grade { get; set; }
public string Subject{ get; private set; }
public int YearsAtSchool { get; private set; }
public int NumberOfStudents { get; set; }
}
}
1 change: 1 addition & 0 deletions TestStack.Dossier.Tests/TestStack.Dossier.Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@
<Compile Include="Builders\StudentViewModelBuilder.cs" />
<Compile Include="Builders\AutoConstructorCustomerBuilder.cs" />
<Compile Include="ChildBuilderTests.cs" />
<Compile Include="Factories\FactoryTests.cs" />
<Compile Include="Stubs\Entities\Company.cs" />
<Compile Include="Stubs\Entities\Customer.cs" />
<Compile Include="Stubs\Entities\CustomerClass.cs" />
Expand Down
13 changes: 1 addition & 12 deletions TestStack.Dossier/Builder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,6 @@ namespace TestStack.Dossier
public class Builder<T> : TestDataBuilder<T, Builder<T>>
where T : class
{
/// <inheritdoc />
public Builder()
: this(new AllPropertiesFactory())
{

}

/// <inheritdoc />
public Builder(IFactory factory)
: base(factory) { }

/// <summary>
/// Initialises a new Builder.
/// </summary>
Expand All @@ -30,7 +19,7 @@ public static Builder<T> CreateNew(IFactory factory = null)
{
factory = new AllPropertiesFactory();
}
return new Builder<T>(factory);
return new Builder<T> {Factory = factory};
}
}
}
2 changes: 1 addition & 1 deletion TestStack.Dossier/Factories/ConstructorFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ namespace TestStack.Dossier.Factories
public class ConstructorFactory : IFactory
{
/// <inheritdoc />
public TObject BuildObject<TObject, TBuilder>(TestDataBuilder<TObject, TBuilder> builder)
public virtual TObject BuildObject<TObject, TBuilder>(TestDataBuilder<TObject, TBuilder> builder)
where TObject : class
where TBuilder : TestDataBuilder<TObject, TBuilder>, new()
{
Expand Down
17 changes: 10 additions & 7 deletions TestStack.Dossier/Factories/PublicPropertiesFactory.cs
Original file line number Diff line number Diff line change
@@ -1,23 +1,21 @@
using Ploeh.AutoFixture;
using System.Reflection;

namespace TestStack.Dossier.Factories
{
/// <summary>
/// Creates an instance of an object by setting all public properties but not private properties.
/// </summary>
public class PublicPropertiesFactory : IFactory
public class PublicPropertiesFactory : ConstructorFactory
{
/// <inheritdoc />
public TObject BuildObject<TObject, TBuilder>(TestDataBuilder<TObject, TBuilder> builder)
where TObject : class
where TBuilder : TestDataBuilder<TObject, TBuilder>, new()
public override TObject BuildObject<TObject, TBuilder>(TestDataBuilder<TObject, TBuilder> builder)
{
var model = builder.Any.Fixture.Create<TObject>();
var model = base.BuildObject(builder);

var properties = Reflector.GetSettablePropertiesFor<TObject>();
foreach (var property in properties)
{
if (property.CanWrite && property.GetSetMethod().IsPublic)
if (PropertySetterIsPublic(property))
{
var val = builder.Get(property.PropertyType, property.Name);
property.SetValue(model, val, null);
Expand All @@ -26,5 +24,10 @@ public TObject BuildObject<TObject, TBuilder>(TestDataBuilder<TObject, TBuilder>

return model;
}

private static bool PropertySetterIsPublic(PropertyInfo property)
{
return property.CanWrite && property.GetSetMethod() != null;
}
}
}
10 changes: 7 additions & 3 deletions TestStack.Dossier/TestDataBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,14 @@ public abstract class TestDataBuilder<TObject, TBuilder>
where TObject : class
where TBuilder : TestDataBuilder<TObject, TBuilder>, new()
{
private readonly IFactory _factory;
private readonly Dictionary<string, object> _properties = new Dictionary<string, object>(StringComparer.InvariantCultureIgnoreCase);
private ProxyBuilder<TObject> _proxyBuilder;

/// <summary>
/// The factory used to create the instance of TObject.
/// </summary>
public IFactory Factory;

/// <summary>
/// The list builder instance (if this ia a list builder proxy).
/// </summary>
Expand All @@ -37,7 +41,7 @@ protected TestDataBuilder()
/// </summary>
protected TestDataBuilder(IFactory factory)
{
_factory = factory;
Factory = factory;
Any = new AnonymousValueFixture();
}

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

return model;
}
Expand Down

0 comments on commit 72280f3

Please sign in to comment.