Skip to content

Commit 3d5e358

Browse files
committed
Merge pull request #139 from JakeGinnivan/MethodCallArgument
Try to invoke methods to include value in step title, if we fail just ig...
2 parents 7ac863f + fd68980 commit 3d5e358

5 files changed

Lines changed: 92 additions & 18 deletions

File tree

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,23 @@ public void ComplexArgumentWhenContainerIsNull()
226226
AssertReturnedArguments(arguments, new object[] { null });
227227
}
228228

229+
[Test]
230+
public void MethodCallValue()
231+
{
232+
var arguments = GetArguments(x => x.MethodWithInputs(GetNumberThree(), GetFooString()), new ClassUnderTest());
233+
AssertReturnedArguments(arguments, new object[] { 3, "Foo" });
234+
}
235+
236+
private string GetFooString()
237+
{
238+
return "Foo";
239+
}
240+
241+
private int GetNumberThree()
242+
{
243+
return 3;
244+
}
245+
229246
[Test]
230247
public void ArrayInputArgumentsProvidedUsingInheritedProperty()
231248
{
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
using System.Linq;
2+
using NUnit.Framework;
3+
using Shouldly;
4+
5+
namespace TestStack.BDDfy.Tests.Scanner.FluentScanner
6+
{
7+
[TestFixture]
8+
public class StepTitleTests
9+
{
10+
private string _mutatedState;
11+
12+
[Test]
13+
public void MethodCallInStepTitle()
14+
{
15+
var story = this
16+
.Given(_ => GivenWeMutateSomeState())
17+
.Then(_ => ThenTitleHas(AMethodCall()))
18+
.BDDfy();
19+
20+
story.Scenarios.Single().Steps.ElementAt(1).Title.ShouldBe("Then title has Mutated state");
21+
}
22+
23+
private string AMethodCall()
24+
{
25+
return _mutatedState;
26+
}
27+
28+
private void GivenWeMutateSomeState()
29+
{
30+
_mutatedState = "Mutated state";
31+
}
32+
33+
private void ThenTitleHas(string result)
34+
{
35+
result.ShouldBe(_mutatedState);
36+
}
37+
}
38+
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@
8989
<Compile Include="Scanner\FluentScanner\DoesNotConflictWithnSubstitute.cs" />
9090
<Compile Include="Scanner\FluentScanner\FluentWithExamples.cs" />
9191
<Compile Include="Scanner\FluentScanner\InlineAssertions.cs" />
92+
<Compile Include="Scanner\FluentScanner\StepTitleTests.cs" />
9293
<Compile Include="Scanner\ReflectiveScanner\ReflectiveWithExamples.cs" />
9394
<Compile Include="Scanner\StepScanners\Examples\ExampleTableTests.cs" />
9495
<Compile Include="Scanner\StepScanners\Examples\ExampleValueTests.cs" />

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

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,19 @@ private static IEnumerable<StepArgument> ExtractArguments<T>(Expression expressi
6161
if (unaryExpression != null)
6262
return ExtractArguments(unaryExpression, value);
6363

64+
var methodCallExpression = expression as MethodCallExpression;
65+
if (methodCallExpression != null)
66+
return Invoke(methodCallExpression, ExtractArguments(methodCallExpression, value));
67+
6468
return new StepArgument[0];
6569
}
6670

71+
private static IEnumerable<StepArgument> Invoke(MethodCallExpression methodCallExpression, IEnumerable<StepArgument> args)
72+
{
73+
var value = ((ConstantExpression)methodCallExpression.Object).Value;
74+
return new[] { new StepArgument(() => methodCallExpression.Method.Invoke(value, args.Select(s => s.Value).ToArray())) };
75+
}
76+
6777
private static IEnumerable<StepArgument> ExtractArguments<T>(MethodCallExpression methodCallExpression, T value)
6878
{
6979
var constants = new List<StepArgument>();
@@ -90,7 +100,7 @@ private static IEnumerable<StepArgument> ExtractArguments<T>(NewExpression newEx
90100
arguments.AddRange(ExtractArguments(argumentExpression, value));
91101
}
92102

93-
return new[] { new StepArgument(newExpression.Constructor.Invoke(arguments.Select(o => o.Value).ToArray())) };
103+
return new[] { new StepArgument(() => newExpression.Constructor.Invoke(arguments.Select(o => o.Value).ToArray())) };
94104
}
95105

96106
private static IEnumerable<StepArgument> ExtractArguments<T>(NewArrayExpression newArrayExpression, T value)
@@ -124,7 +134,7 @@ private static IEnumerable<StepArgument> ExtractNonConvertibleArrayConstants<T>(
124134
arrayElements.Add(arrayElement);
125135
}
126136

127-
return ToArray(arrayElements).Select(o => new StepArgument(o));
137+
return ToArray(arrayElements).Select(o => new StepArgument(() => o));
128138
}
129139

130140
private static IEnumerable<object> ToArray(IList list)
@@ -147,7 +157,7 @@ private static IEnumerable<StepArgument> ExtractConvertibleTypeArrayConstants(Ne
147157
arrayElements.Add(Convert.ChangeType(arrayElement, arrayElementExpression.Type, null));
148158
}
149159

150-
return new[] { new StepArgument(ToArray(arrayElements)) };
160+
return new[] { new StepArgument(() => ToArray(arrayElements)) };
151161
}
152162

153163
private static IEnumerable<StepArgument> ExtractArguments<T>(ConstantExpression constantExpression, T value)
@@ -164,7 +174,7 @@ private static IEnumerable<StepArgument> ExtractArguments<T>(ConstantExpression
164174
constantExpression.Type.IsPrimitive ||
165175
constantExpression.Type.IsEnum ||
166176
constantExpression.Value == null)
167-
constants.Add(new StepArgument(constantExpression.Value));
177+
constants.Add(new StepArgument(() => constantExpression.Value));
168178

169179
return constants;
170180
}
@@ -220,14 +230,7 @@ private static StepArgument ExtractPropertyValue<T>(MemberExpression expression,
220230
if (memberExpression != null)
221231
{
222232
var extractArguments = ExtractArgument(memberExpression, value).Value;
223-
try
224-
{
225-
return new StepArgument(member, extractArguments);
226-
}
227-
catch (TargetException)
228-
{
229-
return new StepArgument(null);
230-
}
233+
return new StepArgument(member, extractArguments);
231234
}
232235
return new StepArgument(member, value);
233236
}

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

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,31 +6,46 @@ namespace TestStack.BDDfy
66
public class StepArgument
77
{
88
private readonly Action<object> _set = o => { };
9+
private readonly Func<object> _get;
910

1011
public StepArgument(FieldInfo member, object declaringObject)
1112
{
1213
Name = member.Name;
13-
Value = member.GetValue(declaringObject);
14+
_get = () => member.GetValue(declaringObject);
1415
_set = o => member.SetValue(declaringObject, o);
1516
ArgumentType = member.FieldType;
1617
}
1718

1819
public StepArgument(PropertyInfo member, object declaringObject)
1920
{
2021
Name = member.Name;
21-
Value = member.GetGetMethod(true).Invoke(declaringObject, null);
22+
_get = () => member.GetGetMethod(true).Invoke(declaringObject, null);
2223
_set = o => member.GetSetMethod(true).Invoke(declaringObject, new[] { o });
2324
ArgumentType = member.PropertyType;
2425
}
2526

26-
public StepArgument(object value)
27+
public StepArgument(Func<object> value)
2728
{
28-
Value = value;
29+
_get = value;
2930
ArgumentType = typeof(object);
3031
}
3132

32-
public string Name { get; set; }
33-
public object Value { get; set; }
33+
public string Name { get; private set; }
34+
35+
public object Value
36+
{
37+
get
38+
{
39+
try
40+
{
41+
return _get();
42+
}
43+
catch (Exception)
44+
{
45+
return null;
46+
}
47+
}
48+
}
3449
public Type ArgumentType { get; private set; }
3550

3651
public void SetValue(object newValue)

0 commit comments

Comments
 (0)