Skip to content

Commit 513d447

Browse files
author
Jake Ginnivan
committed
Fixed issue with BDDfy conflicting with nSubstitute
1 parent 871d8a5 commit 513d447

8 files changed

Lines changed: 348 additions & 243 deletions

File tree

TestStack.BDDfy.Tests/Scanner/FluentScanner/ComplexStepsTests.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,13 @@ namespace TestStack.BDDfy.Tests.Scanner.FluentScanner
66
[TestFixture]
77
public class ComplexStepsTests
88
{
9-
private int count = 0;
9+
private int count;
1010

1111
[Test]
1212
public void ShouldBeAbleToChainComplexTestWithFluentApi()
1313
{
14-
this.When(() => count++.ShouldBe(0), "When I do something")
14+
this.Given(_ => count.ShouldBe(0))
15+
.When(() => count++.ShouldBe(0), "When I do something")
1516
.Given(() => count++.ShouldBe(1), "Given I am doing things in different order")
1617
.Then(() => count++.ShouldBe(2), "Then they should run in defined order")
1718
.When(() => count++.ShouldBe(3), "When I have whens after thens things still work")

TestStack.BDDfy.Tests/Stories/StoryCanBeSpecifiedInFluentMode.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ public class StoryCanBeSpecifiedInFluentMode
99
public void Verify()
1010
{
1111
var story = this
12+
.Given("Given step must be first")
1213
.When(_ => WhenStoryIsSpecifiedInFluentMode())
1314
.Then(_ => ThenTheSpecifiedStoryShouldBeUsed())
1415
.BDDfy<SharedStoryNotion>();

TestStack.BDDfy/Scanners/StepScanners/Fluent/FluentApi.cs

Lines changed: 260 additions & 198 deletions
Large diffs are not rendered by default.

TestStack.BDDfy/Scanners/StepScanners/Fluent/FluentApi.tt

Lines changed: 44 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,19 @@
88
var steps = new[]
99
{
1010
//StepName, reports, executionOrder, asserts
11-
Tuple.Create("Given", "true", "ExecutionOrder.SetupState", "false"),
12-
Tuple.Create("When", "true", "ExecutionOrder.Transition", "false"),
13-
Tuple.Create("Then", "true", "ExecutionOrder.Assertion", "true"),
14-
Tuple.Create("And", "true", "ExecutionOrder.ConsecutiveStep", "false"),
15-
Tuple.Create("But", "true", "ExecutionOrder.ConsecutiveStep", "false"),
16-
Tuple.Create("TearDownWith", "false", "ExecutionOrder.TearDown", "false")
11+
Tuple.Create("Given", "true", "ExecutionOrder.SetupState", "false", "TScenario", "testObject"),
12+
Tuple.Create("Given", "true", "ExecutionOrder.SetupState", "false", "IFluentTestBuilder<TScenario>", "testObject.TestObject"),
13+
Tuple.Create("When", "true", "ExecutionOrder.Transition", "false", "IFluentTestBuilder<TScenario>", "testObject.TestObject"),
14+
Tuple.Create("Then", "true", "ExecutionOrder.Assertion", "true", "IFluentTestBuilder<TScenario>", "testObject.TestObject"),
15+
Tuple.Create("And", "true", "ExecutionOrder.ConsecutiveStep", "false", "IFluentTestBuilder<TScenario>", "testObject.TestObject"),
16+
Tuple.Create("But", "true", "ExecutionOrder.ConsecutiveStep", "false", "IFluentTestBuilder<TScenario>", "testObject.TestObject"),
17+
Tuple.Create("TearDownWith", "false", "ExecutionOrder.TearDown", "false", "IFluentTestBuilder<TScenario>", "testObject.TestObject")
1718
};
1819
#>
1920
using System;
2021
using System.Linq.Expressions;
2122
using System.Threading.Tasks;
22-
23+
2324
// ReSharper disable CheckNamespace
2425
// This is in BDDfy namespace to make its usage simpler
2526
namespace TestStack.BDDfy
@@ -32,75 +33,75 @@ namespace TestStack.BDDfy
3233
var existingContext = TestContext.GetContext(testObject);
3334
if (existingContext.FluentScanner == null)
3435
existingContext.FluentScanner = new FluentScanner<TScenario>(testObject);
35-
36+
3637
return (FluentScanner<TScenario>) existingContext.FluentScanner;
3738
}
38-
39+
3940
<#
4041
foreach (var stepType in steps)
4142
{
4243
#>
43-
public static TScenario <#=stepType.Item1#><TScenario>(this TScenario testObject, Expression<Action<TScenario>> step, string stepTextTemplate)
44+
public static IFluentTestBuilder<TScenario> <#=stepType.Item1#><TScenario>(this <#=stepType.Item5#> testObject, Expression<Action<TScenario>> step, string stepTextTemplate)
4445
where TScenario: class
4546
{
46-
testObject.Scan().AddStep(step, stepTextTemplate, true, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
47-
return testObject;
47+
<#=stepType.Item6#>.Scan().AddStep(step, stepTextTemplate, true, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
48+
return new FluentTestBuilder<TScenario>(<#=stepType.Item6#>);
4849
}
49-
50-
public static TScenario <#=stepType.Item1#><TScenario>(this TScenario testObject, Expression<Action<TScenario>> step, bool includeInputsInStepTitle)
50+
51+
public static IFluentTestBuilder<TScenario> <#=stepType.Item1#><TScenario>(this <#=stepType.Item5#> testObject, Expression<Action<TScenario>> step, bool includeInputsInStepTitle)
5152
where TScenario: class
5253
{
53-
testObject.Scan().AddStep(step, null, includeInputsInStepTitle, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
54-
return testObject;
54+
<#=stepType.Item6#>.Scan().AddStep(step, null, includeInputsInStepTitle, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
55+
return new FluentTestBuilder<TScenario>(<#=stepType.Item6#>);
5556
}
56-
57-
public static TScenario <#=stepType.Item1#><TScenario>(this TScenario testObject, Expression<Action<TScenario>> step)
57+
58+
public static IFluentTestBuilder<TScenario> <#=stepType.Item1#><TScenario>(this <#=stepType.Item5#> testObject, Expression<Action<TScenario>> step)
5859
where TScenario: class
5960
{
60-
testObject.Scan().AddStep(step, null, true, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
61-
return testObject;
61+
<#=stepType.Item6#>.Scan().AddStep(step, null, true, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
62+
return new FluentTestBuilder<TScenario>(<#=stepType.Item6#>);
6263
}
6364

64-
public static TScenario <#=stepType.Item1#><TScenario>(this TScenario testObject, Expression<Func<TScenario, Task>> step, string stepTextTemplate)
65+
public static IFluentTestBuilder<TScenario> <#=stepType.Item1#><TScenario>(this <#=stepType.Item5#> testObject, Expression<Func<TScenario, Task>> step, string stepTextTemplate)
6566
where TScenario: class
6667
{
67-
testObject.Scan().AddStep(step, stepTextTemplate, true, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
68-
return testObject;
68+
<#=stepType.Item6#>.Scan().AddStep(step, stepTextTemplate, true, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
69+
return new FluentTestBuilder<TScenario>(<#=stepType.Item6#>);
6970
}
70-
71-
public static TScenario <#=stepType.Item1#><TScenario>(this TScenario testObject, Expression<Func<TScenario, Task>> step, bool includeInputsInStepTitle)
71+
72+
public static IFluentTestBuilder<TScenario> <#=stepType.Item1#><TScenario>(this <#=stepType.Item5#> testObject, Expression<Func<TScenario, Task>> step, bool includeInputsInStepTitle)
7273
where TScenario: class
7374
{
74-
testObject.Scan().AddStep(step, null, includeInputsInStepTitle, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
75-
return testObject;
75+
<#=stepType.Item6#>.Scan().AddStep(step, null, includeInputsInStepTitle, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
76+
return new FluentTestBuilder<TScenario>(<#=stepType.Item6#>);
7677
}
77-
78-
public static TScenario <#=stepType.Item1#><TScenario>(this TScenario testObject, Expression<Func<TScenario, Task>> step)
78+
79+
public static IFluentTestBuilder<TScenario> <#=stepType.Item1#><TScenario>(this <#=stepType.Item5#> testObject, Expression<Func<TScenario, Task>> step)
7980
where TScenario: class
8081
{
81-
testObject.Scan().AddStep(step, null, true, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
82-
return testObject;
82+
<#=stepType.Item6#>.Scan().AddStep(step, null, true, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
83+
return new FluentTestBuilder<TScenario>(<#=stepType.Item6#>);
8384
}
84-
85-
public static TScenario <#=stepType.Item1#><TScenario>(this TScenario testObject, Action step, string title)
85+
86+
public static IFluentTestBuilder<TScenario> <#=stepType.Item1#><TScenario>(this <#=stepType.Item5#> testObject, Action step, string title)
8687
where TScenario : class
8788
{
88-
testObject.Scan().AddStep(step, title, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
89-
return testObject;
89+
<#=stepType.Item6#>.Scan().AddStep(step, title, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
90+
return new FluentTestBuilder<TScenario>(<#=stepType.Item6#>);
9091
}
91-
92-
public static TScenario <#=stepType.Item1#><TScenario>(this TScenario testObject, Func<Task> step, string title)
92+
93+
public static IFluentTestBuilder<TScenario> <#=stepType.Item1#><TScenario>(this <#=stepType.Item5#> testObject, Func<Task> step, string title)
9394
where TScenario : class
9495
{
95-
testObject.Scan().AddStep(step, title, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
96-
return testObject;
96+
<#=stepType.Item6#>.Scan().AddStep(step, title, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
97+
return new FluentTestBuilder<TScenario>(<#=stepType.Item6#>);
9798
}
98-
99-
public static TScenario <#=stepType.Item1#><TScenario>(this TScenario testObject, string title)
99+
100+
public static IFluentTestBuilder<TScenario> <#=stepType.Item1#><TScenario>(this <#=stepType.Item5#> testObject, string title)
100101
where TScenario : class
101102
{
102-
testObject.Scan().AddStep(() => { }, title, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
103-
return testObject;
103+
<#=stepType.Item6#>.Scan().AddStep(() => { }, title, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
104+
return new FluentTestBuilder<TScenario>(<#=stepType.Item6#>);
104105
}
105106
<#
106107
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
namespace TestStack.BDDfy
2+
{
3+
public class FluentTestBuilder<T> : IFluentTestBuilder<T>, IFluentTestBuilder
4+
{
5+
public FluentTestBuilder(T testObject)
6+
{
7+
TestObject = testObject;
8+
}
9+
10+
public T TestObject { get; private set; }
11+
12+
object IFluentTestBuilder.TestObject
13+
{
14+
get
15+
{
16+
return TestObject;
17+
}
18+
}
19+
}
20+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
namespace TestStack.BDDfy
2+
{
3+
public interface IFluentTestBuilder<T>
4+
{
5+
T TestObject { get; }
6+
}
7+
8+
interface IFluentTestBuilder
9+
{
10+
object TestObject { get; }
11+
}
12+
}

TestStack.BDDfy/TestContext.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ private TestContext(object testObject)
1313

1414
public static void SetContext(object testObject, ITestContext context)
1515
{
16+
var fluentBuilder = testObject as IFluentTestBuilder;
17+
if (fluentBuilder != null) testObject = fluentBuilder.TestObject;
18+
1619
if (ContextLookup.ContainsKey(testObject))
1720
{
1821
var oldContext = ContextLookup[testObject];
@@ -27,6 +30,9 @@ public static void SetContext(object testObject, ITestContext context)
2730

2831
public static ITestContext GetContext(object testObject)
2932
{
33+
var fluentBuilder = testObject as IFluentTestBuilder;
34+
if (fluentBuilder != null) testObject = fluentBuilder.TestObject;
35+
3036
if (!ContextLookup.ContainsKey(testObject))
3137
ContextLookup.Add(testObject, new TestContext(testObject));
3238

TestStack.BDDfy/TestStack.BDDfy.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,8 +119,10 @@
119119
<DesignTime>True</DesignTime>
120120
<DependentUpon>FluentApi.tt</DependentUpon>
121121
</Compile>
122+
<Compile Include="Scanners\StepScanners\Fluent\FluentTestBuilder.cs" />
122123
<Compile Include="Scanners\StepScanners\Fluent\IFluentScanner.cs" />
123124
<Compile Include="Scanners\StepScanners\Examples\WithExamplesExtensions.cs" />
125+
<Compile Include="Scanners\StepScanners\Fluent\IFluentTestBuilder.cs" />
124126
<Compile Include="Scenario.cs" />
125127
<Compile Include="Engine.cs" />
126128
<Compile Include="StepTitle.cs" />

0 commit comments

Comments
 (0)