Skip to content

Commit bc87dad

Browse files
author
Jake Ginnivan
committed
Now properly doesn't conflict with nSubsitute
1 parent 513d447 commit bc87dad

7 files changed

Lines changed: 532 additions & 372 deletions

File tree

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
using NSubstitute;
2+
using NUnit.Framework;
3+
4+
namespace TestStack.BDDfy.Tests.Scanner.FluentScanner
5+
{
6+
public class DoesNotConflictWithnSubstitute
7+
{
8+
private ITestContext _subsitute;
9+
private ExampleTable _exampleTable;
10+
11+
[Test]
12+
public void CanUseFluentApiWithNSubstitute()
13+
{
14+
this.Given(_ => GivenSomeStuff())
15+
.When(_ => WhenSomethingHappens())
16+
.Then(_ => ThenICanStillUseNSubsitute())
17+
.BDDfy();
18+
}
19+
20+
private void ThenICanStillUseNSubsitute()
21+
{
22+
_subsitute.Received().Examples = _exampleTable;
23+
}
24+
25+
private void WhenSomethingHappens()
26+
{
27+
_exampleTable = new ExampleTable();
28+
_subsitute.Examples = _exampleTable;
29+
}
30+
31+
private void GivenSomeStuff()
32+
{
33+
_subsitute = Substitute.For<ITestContext>();
34+
}
35+
}
36+
}

TestStack.BDDfy.Tests/TestStack.BDDfy.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@
8585
<Compile Include="Reporters\Html\TestableHtmlReporter.cs" />
8686
<Compile Include="Reporters\ReportApprover.cs" />
8787
<Compile Include="Scanner\FluentScanner\ComplexStepsTests.cs" />
88+
<Compile Include="Scanner\FluentScanner\DoesNotConflictWithnSubstitute.cs" />
8889
<Compile Include="Scanner\FluentScanner\FluentWithExamples.cs" />
8990
<Compile Include="Scanner\FluentScanner\InlineAssertions.cs" />
9091
<Compile Include="Scanner\ReflectiveScanner\ReflectiveWithExamples.cs" />

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

Lines changed: 358 additions & 291 deletions
Large diffs are not rendered by default.

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

Lines changed: 137 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,12 @@
88
var steps = new[]
99
{
1010
//StepName, reports, executionOrder, asserts
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")
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")
1817
};
1918
#>
2019
using System;
@@ -28,80 +27,171 @@ namespace TestStack.BDDfy
2827
{
2928
public static class FluentStepScannerExtensions
3029
{
31-
static FluentScanner<TScenario> Scan<TScenario>(this TScenario testObject) where TScenario : class
32-
{
33-
var existingContext = TestContext.GetContext(testObject);
34-
if (existingContext.FluentScanner == null)
35-
existingContext.FluentScanner = new FluentScanner<TScenario>(testObject);
36-
37-
return (FluentScanner<TScenario>) existingContext.FluentScanner;
38-
}
39-
40-
<#
41-
foreach (var stepType in steps)
42-
{
43-
#>
44-
public static IFluentTestBuilder<TScenario> <#=stepType.Item1#><TScenario>(this <#=stepType.Item5#> testObject, Expression<Action<TScenario>> step, string stepTextTemplate)
30+
public static IFluentTestBuilder<TScenario> Given<TScenario>(this TScenario testObject, Expression<Action<TScenario>> step, string stepTextTemplate)
4531
where TScenario: class
4632
{
47-
<#=stepType.Item6#>.Scan().AddStep(step, stepTextTemplate, true, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
48-
return new FluentTestBuilder<TScenario>(<#=stepType.Item6#>);
33+
return new FluentTestBuilder<TScenario>(testObject).Given(step, stepTextTemplate);
4934
}
5035

51-
public static IFluentTestBuilder<TScenario> <#=stepType.Item1#><TScenario>(this <#=stepType.Item5#> testObject, Expression<Action<TScenario>> step, bool includeInputsInStepTitle)
36+
public static IFluentTestBuilder<TScenario> Given<TScenario>(this TScenario testObject, Expression<Action<TScenario>> step, bool includeInputsInStepTitle)
5237
where TScenario: class
5338
{
54-
<#=stepType.Item6#>.Scan().AddStep(step, null, includeInputsInStepTitle, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
55-
return new FluentTestBuilder<TScenario>(<#=stepType.Item6#>);
39+
return new FluentTestBuilder<TScenario>(testObject).Given(step, includeInputsInStepTitle);
5640
}
5741

58-
public static IFluentTestBuilder<TScenario> <#=stepType.Item1#><TScenario>(this <#=stepType.Item5#> testObject, Expression<Action<TScenario>> step)
42+
public static IFluentTestBuilder<TScenario> Given<TScenario>(this TScenario testObject, Expression<Action<TScenario>> step)
5943
where TScenario: class
6044
{
61-
<#=stepType.Item6#>.Scan().AddStep(step, null, true, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
62-
return new FluentTestBuilder<TScenario>(<#=stepType.Item6#>);
45+
return new FluentTestBuilder<TScenario>(testObject).Given(step);
6346
}
6447

65-
public static IFluentTestBuilder<TScenario> <#=stepType.Item1#><TScenario>(this <#=stepType.Item5#> testObject, Expression<Func<TScenario, Task>> step, string stepTextTemplate)
48+
public static IFluentTestBuilder<TScenario> Given<TScenario>(this TScenario testObject, Expression<Func<TScenario, Task>> step, string stepTextTemplate)
6649
where TScenario: class
6750
{
68-
<#=stepType.Item6#>.Scan().AddStep(step, stepTextTemplate, true, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
69-
return new FluentTestBuilder<TScenario>(<#=stepType.Item6#>);
51+
return new FluentTestBuilder<TScenario>(testObject).Given(step, stepTextTemplate);
7052
}
7153

72-
public static IFluentTestBuilder<TScenario> <#=stepType.Item1#><TScenario>(this <#=stepType.Item5#> testObject, Expression<Func<TScenario, Task>> step, bool includeInputsInStepTitle)
54+
public static IFluentTestBuilder<TScenario> Given<TScenario>(this TScenario testObject, Expression<Func<TScenario, Task>> step, bool includeInputsInStepTitle)
7355
where TScenario: class
7456
{
75-
<#=stepType.Item6#>.Scan().AddStep(step, null, includeInputsInStepTitle, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
76-
return new FluentTestBuilder<TScenario>(<#=stepType.Item6#>);
57+
return new FluentTestBuilder<TScenario>(testObject).Given(step, includeInputsInStepTitle);
7758
}
7859

79-
public static IFluentTestBuilder<TScenario> <#=stepType.Item1#><TScenario>(this <#=stepType.Item5#> testObject, Expression<Func<TScenario, Task>> step)
60+
public static IFluentTestBuilder<TScenario> Given<TScenario>(this TScenario testObject, Expression<Func<TScenario, Task>> step)
8061
where TScenario: class
8162
{
82-
<#=stepType.Item6#>.Scan().AddStep(step, null, true, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
83-
return new FluentTestBuilder<TScenario>(<#=stepType.Item6#>);
63+
return new FluentTestBuilder<TScenario>(testObject).Given(step);
8464
}
8565

86-
public static IFluentTestBuilder<TScenario> <#=stepType.Item1#><TScenario>(this <#=stepType.Item5#> testObject, Action step, string title)
66+
public static IFluentTestBuilder<TScenario> Given<TScenario>(this TScenario testObject, Action step, string title)
8767
where TScenario : class
8868
{
89-
<#=stepType.Item6#>.Scan().AddStep(step, title, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
90-
return new FluentTestBuilder<TScenario>(<#=stepType.Item6#>);
69+
return new FluentTestBuilder<TScenario>(testObject).Given(step, title);
9170
}
9271

93-
public static IFluentTestBuilder<TScenario> <#=stepType.Item1#><TScenario>(this <#=stepType.Item5#> testObject, Func<Task> step, string title)
72+
public static IFluentTestBuilder<TScenario> Given<TScenario>(this TScenario testObject, Func<Task> step, string title)
9473
where TScenario : class
9574
{
96-
<#=stepType.Item6#>.Scan().AddStep(step, title, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
97-
return new FluentTestBuilder<TScenario>(<#=stepType.Item6#>);
75+
return new FluentTestBuilder<TScenario>(testObject).Given(step, title);
9876
}
9977

100-
public static IFluentTestBuilder<TScenario> <#=stepType.Item1#><TScenario>(this <#=stepType.Item5#> testObject, string title)
78+
public static IFluentTestBuilder<TScenario> Given<TScenario>(this TScenario testObject, string title)
10179
where TScenario : class
10280
{
103-
<#=stepType.Item6#>.Scan().AddStep(() => { }, title, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
104-
return new FluentTestBuilder<TScenario>(<#=stepType.Item6#>);
81+
return new FluentTestBuilder<TScenario>(testObject).Given(title);
82+
}
83+
}
84+
85+
public interface IFluentTestBuilder<TScenario> where TScenario: class
86+
{
87+
TScenario TestObject { get; }
88+
<#
89+
foreach (var stepType in steps)
90+
{
91+
#>
92+
93+
IFluentTestBuilder<TScenario> <#=stepType.Item1#>(Expression<Action<TScenario>> step, string stepTextTemplate);
94+
95+
IFluentTestBuilder<TScenario> <#=stepType.Item1#>(Expression<Action<TScenario>> step, bool includeInputsInStepTitle);
96+
97+
IFluentTestBuilder<TScenario> <#=stepType.Item1#>(Expression<Action<TScenario>> step);
98+
99+
IFluentTestBuilder<TScenario> <#=stepType.Item1#>(Expression<Func<TScenario, Task>> step, string stepTextTemplate);
100+
101+
IFluentTestBuilder<TScenario> <#=stepType.Item1#>(Expression<Func<TScenario, Task>> step, bool includeInputsInStepTitle);
102+
103+
IFluentTestBuilder<TScenario> <#=stepType.Item1#>(Expression<Func<TScenario, Task>> step);
104+
105+
IFluentTestBuilder<TScenario> <#=stepType.Item1#>(Action step, string title);
106+
107+
IFluentTestBuilder<TScenario> <#=stepType.Item1#>(Func<Task> step, string title);
108+
109+
IFluentTestBuilder<TScenario> <#=stepType.Item1#>(string title);
110+
<#
111+
}
112+
#>
113+
}
114+
115+
interface IFluentTestBuilder
116+
{
117+
object TestObject { get; }
118+
}
119+
120+
public class FluentTestBuilder<TScenario> : IFluentTestBuilder<TScenario>, IFluentTestBuilder
121+
where TScenario : class
122+
{
123+
readonly FluentScanner<TScenario> scanner;
124+
125+
public FluentTestBuilder(TScenario testObject)
126+
{
127+
TestObject = testObject;
128+
var existingContext = TestContext.GetContext(TestObject);
129+
if (existingContext.FluentScanner == null)
130+
existingContext.FluentScanner = new FluentScanner<TScenario>(testObject);
131+
132+
scanner = (FluentScanner<TScenario>) existingContext.FluentScanner;
133+
}
134+
135+
public TScenario TestObject { get; private set; }
136+
137+
object IFluentTestBuilder.TestObject { get { return TestObject; } }
138+
139+
<#
140+
foreach (var stepType in steps)
141+
{
142+
#>
143+
public IFluentTestBuilder<TScenario> <#=stepType.Item1#>(Expression<Action<TScenario>> step, string stepTextTemplate)
144+
{
145+
scanner.AddStep(step, stepTextTemplate, true, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
146+
return this;
147+
}
148+
149+
public IFluentTestBuilder<TScenario> <#=stepType.Item1#>(Expression<Action<TScenario>> step, bool includeInputsInStepTitle)
150+
{
151+
scanner.AddStep(step, null, includeInputsInStepTitle, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
152+
return this;
153+
}
154+
155+
public IFluentTestBuilder<TScenario> <#=stepType.Item1#>(Expression<Action<TScenario>> step)
156+
{
157+
scanner.AddStep(step, null, true, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
158+
return this;
159+
}
160+
161+
public IFluentTestBuilder<TScenario> <#=stepType.Item1#>(Expression<Func<TScenario, Task>> step, string stepTextTemplate)
162+
{
163+
scanner.AddStep(step, stepTextTemplate, true, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
164+
return this;
165+
}
166+
167+
public IFluentTestBuilder<TScenario> <#=stepType.Item1#>(Expression<Func<TScenario, Task>> step, bool includeInputsInStepTitle)
168+
{
169+
scanner.AddStep(step, null, includeInputsInStepTitle, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
170+
return this;
171+
}
172+
173+
public IFluentTestBuilder<TScenario> <#=stepType.Item1#>(Expression<Func<TScenario, Task>> step)
174+
{
175+
scanner.AddStep(step, null, true, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
176+
return this;
177+
}
178+
179+
public IFluentTestBuilder<TScenario> <#=stepType.Item1#>(Action step, string title)
180+
{
181+
scanner.AddStep(step, title, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
182+
return this;
183+
}
184+
185+
public IFluentTestBuilder<TScenario> <#=stepType.Item1#>(Func<Task> step, string title)
186+
{
187+
scanner.AddStep(step, title, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
188+
return this;
189+
}
190+
191+
public IFluentTestBuilder<TScenario> <#=stepType.Item1#>(string title)
192+
{
193+
scanner.AddStep(() => { }, title, <#=stepType.Item2#>, <#=stepType.Item3#>, <#=stepType.Item4#>);
194+
return this;
105195
}
106196
<#
107197
}

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

Lines changed: 0 additions & 20 deletions
This file was deleted.

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

Lines changed: 0 additions & 12 deletions
This file was deleted.

TestStack.BDDfy/TestStack.BDDfy.csproj

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

0 commit comments

Comments
 (0)