Skip to content

Commit

Permalink
v1.0.0-alpha.7 - make result assertions more fluent
Browse files Browse the repository at this point in the history
  • Loading branch information
JonnyOrman committed Feb 23, 2022
1 parent bde3e85 commit d211388
Show file tree
Hide file tree
Showing 37 changed files with 420 additions and 106 deletions.
35 changes: 26 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,37 @@ public void MultiplyNumbers() =>
.WhenIt().Multiply(3, 2)
.ThenTheResultShouldBe(6);
[Fact]
public void DivideNumbers() =>
GivenA<Calculator>
.WhenIt().Divide(6, 3)
.ThenTheResultShouldBe(2);
[Fact]
public void DivideByZero() =>
GivenA<Calculator>
.WhenIt(sut => sut.Divide(6, 0))
.ThenItShouldThrow<DivideByZeroException>();
```

Tests that require more detailed setup and assertion will look something like this:
Each test has its own state that allows you to register variables during arrangement. These variables can then be used in the action and assertment:
```
[Fact]
public void CreateEntity() =>
GivenA<Creator>
.AndGiven(new EntityParameters("EntityName"))
.WhenIt(action => action.Sut.Create(action.GetObject<EntityParameters>()))
.ThenTheResult(result => result.Id).ShouldBe(1)
.ThenTheResult(result => result.Name).ShouldBe("EntityName");
```

Variables can be given names to identify them if multiple of the same type are registered:
```
[Fact]
public void CreateEntity_Example2() =>
GivenA<Creator>
.AndGiven(new EntityParameters("EntityName"), "ParametersToUse")
.AndGiven(new EntityParameters("AnotherEntityName"), "SomeOtherParameters")
.WhenIt(action => action.Sut.Create(action.GetObject<EntityParameters>("ParametersToUse")))
.ThenTheResult(result => result.Id).ShouldBe(1)
.ThenTheResult(result => result.Name).ShouldBe("EntityName");
```

More complex setups and assertions including mocks are possible:
```
[Fact]
public void ProcessValidParameters() =>
Expand All @@ -43,7 +60,7 @@ public void ProcessValidParameters() =>
arrangement.Objects.Get<Entity>("entity")
))
.WhenIt(action => action.Sut.Process(action.GetObject<EntityParameters>("parameters")))
.ThenItShould(assertion =>
.Then(assertion =>
{
assertion.Dependencies.GetMock<IValidator>()
.Verify(validator => validator.IsValid(assertion.GetObject<EntityParameters>("parameters")),
Expand All @@ -61,7 +78,7 @@ public void ProcessValidParameters() =>

Install by running the following:
```
dotnet add package XpressTest --version 1.0.0-alpha.5
dotnet add package XpressTest --version 1.0.0-alpha.7
```

Examples of usage can be seen in the `XpressTest.Examples` project in this repository.
39 changes: 35 additions & 4 deletions XpressTest.Examples/Tests/CreatorTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,45 @@ namespace XpressTest.Examples.Tests;
public class CreatorTests
{
[Fact]
public void CreateEntity() =>
public void CreateEntity_Example1() =>
GivenA<Creator>
.AndGiven(new EntityParameters("EntityName"), "EntityParameters")
.WhenIt(action => action.Sut.Create(action.GetObject<EntityParameters>("EntityParameters")))
.ThenItShould(assertion =>
.AndGiven(new EntityParameters("EntityName"))
.WhenIt(action => action.Sut.Create(action.GetObject<EntityParameters>()))
.ThenTheResult(result => result.Id).ShouldBe(1)
.ThenTheResult(result => result.Name).ShouldBe("EntityName");


[Fact]
public void CreateEntity_Example2() =>
GivenA<Creator>
.AndGiven(new EntityParameters("EntityName"), "ParametersToUse")
.AndGiven(new EntityParameters("AnotherEntityName"), "SomeOtherParameters")
.WhenIt(action => action.Sut.Create(action.GetObject<EntityParameters>("ParametersToUse")))
.ThenTheResult(result => result.Id).ShouldBe(1)
.ThenTheResult(result => result.Name).ShouldBe("EntityName");

[Fact]
public void CreateEntity_Example3() =>
GivenA<Creator>
.AndGiven(new EntityParameters("EntityName"), "EntityParametersToUse")
.AndGiven(new EntityParameters("AnotherEntityName"), "SomeOtherEntityParameters")
.WhenIt(action => action.Sut.Create(action.GetObject<EntityParameters>("EntityParametersToUse")))
.Then(assertion =>
{
Assert.Equal(1, assertion.Result.Id);
Assert.Equal("EntityName", assertion.Result.Name);
})
.Test();

[Fact]
public void CreateEntity_Example4()
{
var parameters = new EntityParameters("EntityName");

var entity = new Entity(1, "EntityName");

GivenA<Creator>
.WhenIt().Create(parameters)
.ThenTheResultShouldBeEquivalentTo(entity);
}
}
4 changes: 2 additions & 2 deletions XpressTest.Examples/Tests/ParametersProcessorTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public void ProcessValidParameters() =>
arrangement.Objects.Get<Entity>("entity")
))
.WhenIt(action => action.Sut.Process(action.GetObject<EntityParameters>("parameters")))
.ThenItShould(assertion =>
.Then(assertion =>
{
assertion.Dependencies.GetMock<IValidator>()
.Verify(validator => validator.IsValid(assertion.GetObject<EntityParameters>("parameters")),
Expand All @@ -46,7 +46,7 @@ public void ProcessInvalidParameters() =>
false))
.WithA<ICreator>()
.WhenIt(action => action.Sut.Process(action.GetObject<EntityParameters>("parameters")))
.ThenItShould(assertion =>
.Then(assertion =>
{
assertion.Dependencies.GetMock<IValidator>()
.Verify(
Expand Down
7 changes: 3 additions & 4 deletions XpressTest.Examples/Tests/ValidatorTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,7 @@ public class ValidatorTests
[InlineData(null, false)]
public void ValidateParameters(string name, bool expectedResult) =>
GivenA<Validator>
.AndGiven(new EntityParameters(name), "EntityParameters")
.WhenIt(action => action.Sut.IsValid(action.GetObject<EntityParameters>("EntityParameters")))
.ThenItShould(assertion => { Assert.Equal(expectedResult, assertion.Result); })
.Test();
.AndGiven(new EntityParameters(name))
.WhenIt(action => action.Sut.IsValid(action.GetObject<EntityParameters>()))
.ThenTheResultShouldBe(expectedResult);
}
2 changes: 1 addition & 1 deletion XpressTest.Examples/XpressTest.Examples.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.11.0" />
<PackageReference Include="XpressTest" Version="1.0.0-alpha.6" />
<PackageReference Include="XpressTest" Version="1.0.0-alpha.7" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
Expand Down
6 changes: 5 additions & 1 deletion XpressTest/Arrangement.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,11 @@ IDependencyCollection dependencies

public IDependencyCollection Dependencies { get; }

public T GetObject<T>() => Objects.Get<T>();

public T GetObject<T>(string name) => Objects.Get<T>(name);


public void Add<T>(T obj) => Objects.Add(obj);

public void Add<T>(INamedObject<T> namedObject) => Objects.Add(namedObject);
}
7 changes: 4 additions & 3 deletions XpressTest/AsserterComposer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
public class AsserterComposer<TSut> : IAsserterComposer<TSut>
where TSut : class
{
public IAsserter<System.Action<IAssertion<TSut, TResult>>> Compose<TResult, TDependency>(
public IAsserter<System.Action<IAssertion<TSut, TResult>>, TResult> Compose<TResult, TDependency>(
IDependency dependency,
Func<IAction<TSut>, TResult> action,
IArrangement arrangement)
Expand All @@ -22,10 +22,11 @@ public class AsserterComposer<TSut> : IAsserterComposer<TSut>
actionExecutor,
arrangement
);

var builder = new ResultAsserter<TSut, TResult>(
sutComposer,
sutTesterComposer
sutTesterComposer,
null
);

return builder;
Expand Down
6 changes: 5 additions & 1 deletion XpressTest/Assertion.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,11 @@ IAction<TSut> action

public IDependencyCollection Dependencies => Action.Dependencies;

public T GetObject<T>() => Objects.Get<T>();

public T GetObject<T>(string name) => Objects.Get<T>(name);


public void Add<T>(T obj) => Objects.Add(obj);

public void Add<T>(INamedObject<T> obj) => Objects.Add(obj);
}
9 changes: 7 additions & 2 deletions XpressTest/AssertionExtensions.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
using Xunit;
using FluentAssertions;

namespace XpressTest;

public static class AssertionExtensions
{
public static void ThenTheResultShouldBe<T>(this T actualResult, T expectedResult)
{
Assert.Equal(expectedResult, actualResult);
expectedResult.Should().Be(actualResult);
}

public static void ThenTheResultShouldBeEquivalentTo<T>(this T actualResult, T expectedResult)
{
actualResult.Should().BeEquivalentTo(expectedResult);
}
}
2 changes: 1 addition & 1 deletion XpressTest/DependencyAsserterComposer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ IAsserterComposer<TSut> asserterComposer
_asserterComposer = asserterComposer;
}

public IAsserter<System.Action<IAssertion<TSut, TResult>>> Compose<TResult, TDependency>(
public IAsserter<System.Action<IAssertion<TSut, TResult>>, TResult> Compose<TResult, TDependency>(
TDependency dependencyValue,
Func<IAction<TSut>, TResult> func,
IArrangement arrangement
Expand Down
2 changes: 1 addition & 1 deletion XpressTest/DependencyBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public IMockDependencyBuilder<TSut, TNewDependency> WithA<TNewDependency>() wher
);
}

public IAsserter<System.Action<IAssertion<TSut, TResult>>> WhenIt<TResult>(Func<IAction<TSut>, TResult> func)
public IAsserter<System.Action<IAssertion<TSut, TResult>>, TResult> WhenIt<TResult>(Func<IAction<TSut>, TResult> func)
{
return _testComposer.ComposeAsserter(
_dependency,
Expand Down
9 changes: 7 additions & 2 deletions XpressTest/GivenA.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,14 @@ public static IMockObjectBuilder<TSut, TObject> AndGivenA<TObject>(string name)

public static IObjectBuilder<TSut> AndGiven<TObject>(TObject obj, string name)
{
return ObjectTestInitialiser<TSut, TObject>.Initialise(obj, name);
return NamedObjectTestInitialiser<TSut, TObject>.Initialise(obj, name);
}


public static IObjectBuilder<TSut> AndGiven<TObject>(TObject obj)
{
return ObjectTestInitialiser<TSut, TObject>.Initialise(obj);
}

public static IMockDependencyBuilder<TSut, TDependency> WithA<TDependency>()
where TDependency : class
{
Expand Down
4 changes: 2 additions & 2 deletions XpressTest/IActor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ namespace XpressTest;

public interface IActor<TSut>
{
IAsserter<System.Action<IAssertion<TSut, TResult>>> WhenIt<TResult>(Func<IAction<TSut>, TResult> func);
IAsserter<System.Action<IAssertion<TSut, TResult>>, TResult> WhenIt<TResult>(Func<IAction<TSut>, TResult> func);

IAsserter<System.Action<IArrangement>> WhenIt(System.Action<IAction<TSut>> func);
}
6 changes: 5 additions & 1 deletion XpressTest/IArrangement.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,11 @@ public interface IArrangement

IDependencyCollection Dependencies { get; }

T GetObject<T>();

T GetObject<T>(string name);


void Add<T>(T obj);

void Add<T>(INamedObject<T> namedObject);
}
7 changes: 6 additions & 1 deletion XpressTest/IAsserter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,10 @@ namespace XpressTest;

public interface IAsserter<TAssertion>
{
ITester ThenItShould(TAssertion assertion);
ITester Then(TAssertion assertion);
}

public interface IAsserter<TAssertion, TResult> : IAsserter<TAssertion>, IResultPropertyTargeter<TResult>
{

}
2 changes: 1 addition & 1 deletion XpressTest/IAsserterComposer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

public interface IAsserterComposer<TSut>
{
IAsserter<System.Action<IAssertion<TSut, TResult>>> Compose<TResult, TDependency>(
IAsserter<System.Action<IAssertion<TSut, TResult>>, TResult> Compose<TResult, TDependency>(
IDependency dependency,
Func<IAction<TSut>, TResult> action,
IArrangement arrangement
Expand Down
2 changes: 1 addition & 1 deletion XpressTest/IDependencyAsserterComposer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

public interface IDependencyAsserterComposer<TSut>
{
IAsserter<System.Action<IAssertion<TSut, TResult>>> Compose<TResult, TDependency>(
IAsserter<System.Action<IAssertion<TSut, TResult>>, TResult> Compose<TResult, TDependency>(
TDependency dependencyValue,
Func<IAction<TSut>, TResult> func,
IArrangement arrangement);
Expand Down
2 changes: 1 addition & 1 deletion XpressTest/IMockDependencyAsserterComposer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ namespace XpressTest;

public interface IMockDependencyAsserterComposer<TSut>
{
IAsserter<System.Action<IAssertion<TSut, TResult>>> Compose<TResult, TDependency>(
IAsserter<System.Action<IAssertion<TSut, TResult>>, TResult> Compose<TResult, TDependency>(
Mock<TDependency> dependencyMock,
Func<IAction<TSut>, TResult> func,
IArrangement arrangement
Expand Down
6 changes: 5 additions & 1 deletion XpressTest/IObjectCollection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,10 @@ namespace XpressTest;
public interface IObjectCollection
{
T Get<T>(string name);


T Get<T>();

void Add<T>(INamedObject<T> namedObject);

void Add<T>(T obj);
}
6 changes: 6 additions & 0 deletions XpressTest/IResultPropertyAsserter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace XpressTest;

public interface IResultPropertyAsserter<TResult, TProperty>
{
IResultPropertyTargeter<TResult> ShouldBe(TProperty expectedValue);
}
8 changes: 8 additions & 0 deletions XpressTest/IResultPropertyTargeter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace XpressTest;

public interface IResultPropertyTargeter<TResult>
{
IResultPropertyAsserter<TResult, TProperty> ThenTheResult<TProperty>(Func<TResult, TProperty> targetFunc);

void ThenTheResultShouldBe(TResult expectedResult);
}
4 changes: 2 additions & 2 deletions XpressTest/ITestComposer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ TDependency dependency
)
where TNewDependency : class;

IAsserter<System.Action<IAssertion<TSut, TResult>>> ComposeMockAsserter<TResult, TDependency>(
IAsserter<System.Action<IAssertion<TSut, TResult>>, TResult> ComposeMockAsserter<TResult, TDependency>(
Mock<TDependency> dependency,
Func<IAction<TSut>, TResult> func,
IArrangement arrangement
Expand All @@ -29,7 +29,7 @@ IArrangement arrangement
)
where TDependency : class;

IAsserter<System.Action<IAssertion<TSut, TResult>>> ComposeAsserter<TResult, TDependency>(
IAsserter<System.Action<IAssertion<TSut, TResult>>, TResult> ComposeAsserter<TResult, TDependency>(
TDependency dependency,
Func<IAction<TSut>, TResult> func,
IArrangement arrangement
Expand Down
2 changes: 1 addition & 1 deletion XpressTest/MockDependencyAsserterComposer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ IAsserterComposer<TSut> asserterComposer
_asserterComposer = asserterComposer;
}

public IAsserter<System.Action<IAssertion<TSut, TResult>>> Compose<TResult, TDependency>(
public IAsserter<System.Action<IAssertion<TSut, TResult>>, TResult> Compose<TResult, TDependency>(
Mock<TDependency> dependencyMock,
Func<IAction<TSut>, TResult> func,
IArrangement arrangement
Expand Down
4 changes: 2 additions & 2 deletions XpressTest/MockDependencyBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,15 +52,15 @@ Func<IArrangement, MockSetup<TDependency, TDependencyResult>> func
return this;
}

public IAsserter<System.Action<IAssertion<TSut, TResult>>> WhenIt<TResult>(Func<IAction<TSut>, TResult> func)
public IAsserter<System.Action<IAssertion<TSut, TResult>>, TResult> WhenIt<TResult>(Func<IAction<TSut>, TResult> func)
{
return _testComposer.ComposeMockAsserter(
_dependencyMock,
func,
_testComposer.Arrangement
);
}

public IAsserter<System.Action<IArrangement>> WhenIt(System.Action<IAction<TSut>> func)
{
return _testComposer.ComposeMockAsserter(
Expand Down
Loading

0 comments on commit d211388

Please sign in to comment.