Skip to content

Commit fd68980

Browse files
author
Jake Ginnivan
committed
Made StepArgument evaluation lazy
1 parent 0cd2666 commit fd68980

3 files changed

Lines changed: 42 additions & 32 deletions

File tree

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

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,32 @@ namespace TestStack.BDDfy.Tests.Scanner.FluentScanner
77
[TestFixture]
88
public class StepTitleTests
99
{
10+
private string _mutatedState;
11+
1012
[Test]
1113
public void MethodCallInStepTitle()
1214
{
13-
var story = this.Given(_ => GivenAValueOf(AMethodCall()))
15+
var story = this
16+
.Given(_ => GivenWeMutateSomeState())
17+
.Then(_ => ThenTitleHas(AMethodCall()))
1418
.BDDfy();
1519

16-
story.Scenarios.Single().Steps.Single().Title.ShouldBe("Given a value of Some value");
20+
story.Scenarios.Single().Steps.ElementAt(1).Title.ShouldBe("Then title has Mutated state");
1721
}
1822

1923
private string AMethodCall()
2024
{
21-
return "Some value";
25+
return _mutatedState;
26+
}
27+
28+
private void GivenWeMutateSomeState()
29+
{
30+
_mutatedState = "Mutated state";
2231
}
2332

24-
private void GivenAValueOf(string result)
33+
private void ThenTitleHas(string result)
2534
{
26-
35+
result.ShouldBe(_mutatedState);
2736
}
2837
}
2938
}

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

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -70,15 +70,8 @@ private static IEnumerable<StepArgument> ExtractArguments<T>(Expression expressi
7070

7171
private static IEnumerable<StepArgument> Invoke(MethodCallExpression methodCallExpression, IEnumerable<StepArgument> args)
7272
{
73-
try
74-
{
75-
var value = ((ConstantExpression)methodCallExpression.Object).Value;
76-
return new[] { new StepArgument(methodCallExpression.Method.Invoke(value, args.Select(s => s.Value).ToArray())) };
77-
}
78-
catch (Exception)
79-
{
80-
return Enumerable.Empty<StepArgument>();
81-
}
73+
var value = ((ConstantExpression)methodCallExpression.Object).Value;
74+
return new[] { new StepArgument(() => methodCallExpression.Method.Invoke(value, args.Select(s => s.Value).ToArray())) };
8275
}
8376

8477
private static IEnumerable<StepArgument> ExtractArguments<T>(MethodCallExpression methodCallExpression, T value)
@@ -107,7 +100,7 @@ private static IEnumerable<StepArgument> ExtractArguments<T>(NewExpression newEx
107100
arguments.AddRange(ExtractArguments(argumentExpression, value));
108101
}
109102

110-
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())) };
111104
}
112105

113106
private static IEnumerable<StepArgument> ExtractArguments<T>(NewArrayExpression newArrayExpression, T value)
@@ -141,7 +134,7 @@ private static IEnumerable<StepArgument> ExtractNonConvertibleArrayConstants<T>(
141134
arrayElements.Add(arrayElement);
142135
}
143136

144-
return ToArray(arrayElements).Select(o => new StepArgument(o));
137+
return ToArray(arrayElements).Select(o => new StepArgument(() => o));
145138
}
146139

147140
private static IEnumerable<object> ToArray(IList list)
@@ -164,7 +157,7 @@ private static IEnumerable<StepArgument> ExtractConvertibleTypeArrayConstants(Ne
164157
arrayElements.Add(Convert.ChangeType(arrayElement, arrayElementExpression.Type, null));
165158
}
166159

167-
return new[] { new StepArgument(ToArray(arrayElements)) };
160+
return new[] { new StepArgument(() => ToArray(arrayElements)) };
168161
}
169162

170163
private static IEnumerable<StepArgument> ExtractArguments<T>(ConstantExpression constantExpression, T value)
@@ -181,7 +174,7 @@ private static IEnumerable<StepArgument> ExtractArguments<T>(ConstantExpression
181174
constantExpression.Type.IsPrimitive ||
182175
constantExpression.Type.IsEnum ||
183176
constantExpression.Value == null)
184-
constants.Add(new StepArgument(constantExpression.Value));
177+
constants.Add(new StepArgument(() => constantExpression.Value));
185178

186179
return constants;
187180
}
@@ -237,14 +230,7 @@ private static StepArgument ExtractPropertyValue<T>(MemberExpression expression,
237230
if (memberExpression != null)
238231
{
239232
var extractArguments = ExtractArgument(memberExpression, value).Value;
240-
try
241-
{
242-
return new StepArgument(member, extractArguments);
243-
}
244-
catch (TargetException)
245-
{
246-
return new StepArgument(null);
247-
}
233+
return new StepArgument(member, extractArguments);
248234
}
249235
return new StepArgument(member, value);
250236
}

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)