diff --git a/TestStack.BDDfy.Tests/Scanner/FluentScanner/ExpressionExtensionsTests.cs b/TestStack.BDDfy.Tests/Scanner/FluentScanner/ExpressionExtensionsTests.cs index 0cb66cd..6cbe466 100644 --- a/TestStack.BDDfy.Tests/Scanner/FluentScanner/ExpressionExtensionsTests.cs +++ b/TestStack.BDDfy.Tests/Scanner/FluentScanner/ExpressionExtensionsTests.cs @@ -2,6 +2,7 @@ using System.Linq; using System.Linq.Expressions; using NUnit.Framework; +using Shouldly; namespace TestStack.BDDfy.Tests.Scanner.FluentScanner { @@ -64,6 +65,15 @@ public void MethodWithInputs(ContainerType subContainer) { } + + public Bar Foo { get; set; } + + public class Bar + { + public void Baz() + { + } + } } object[] GetArguments(Expression> action, ClassUnderTest instance) @@ -243,6 +253,13 @@ public void MethodCallValue() AssertReturnedArguments(arguments, new object[] { 3, "Foo" }); } + [Test] + public void DeepPropertyCall() + { + var arguments = GetArguments(x => x.Foo.Baz(), new ClassUnderTest()); + arguments.ShouldBeEmpty(); + } + private string GetFooString() { return "Foo"; diff --git a/TestStack.BDDfy.Tests/Scanner/FluentScanner/StepTitleTests.cs b/TestStack.BDDfy.Tests/Scanner/FluentScanner/StepTitleTests.cs index 24ff0e7..a26995e 100644 --- a/TestStack.BDDfy.Tests/Scanner/FluentScanner/StepTitleTests.cs +++ b/TestStack.BDDfy.Tests/Scanner/FluentScanner/StepTitleTests.cs @@ -12,12 +12,32 @@ public class StepTitleTests [Test] public void MethodCallInStepTitle() { + FooClass something = new FooClass(); var story = this .Given(_ => GivenWeMutateSomeState()) + .When(_ => something.Sub.SomethingHappens()) .Then(_ => ThenTitleHas(AMethodCall())) .BDDfy(); - story.Scenarios.Single().Steps.ElementAt(1).Title.ShouldBe("Then title has Mutated state"); + story.Scenarios.Single().Steps.ElementAt(2).Title.ShouldBe("Then title has Mutated state"); + } + + public class FooClass + { + public FooClass() + { + Sub = new BarClass(); + } + + public BarClass Sub { get; set; } + } + + public class BarClass + { + public void SomethingHappens() + { + + } } private string AMethodCall() diff --git a/TestStack.BDDfy/Scanners/StepScanners/Fluent/ExpressionExtensions.cs b/TestStack.BDDfy/Scanners/StepScanners/Fluent/ExpressionExtensions.cs index 3ad11f8..54408aa 100644 --- a/TestStack.BDDfy/Scanners/StepScanners/Fluent/ExpressionExtensions.cs +++ b/TestStack.BDDfy/Scanners/StepScanners/Fluent/ExpressionExtensions.cs @@ -20,7 +20,7 @@ public static IEnumerable ExtractArguments(this Expression ExtractArguments(this Expression> expression, T value) @@ -33,7 +33,7 @@ public static IEnumerable ExtractArguments(this Expression ExtractArguments(Expression expression, T value) @@ -71,13 +71,19 @@ private static IEnumerable ExtractArguments(Expression expressi private static IEnumerable Invoke(MethodCallExpression methodCallExpression, IEnumerable args) { var constantExpression = methodCallExpression.Object as ConstantExpression; + var stepArguments = args.ToArray(); if (constantExpression != null) - return new[] { new StepArgument(() => methodCallExpression.Method.Invoke(constantExpression.Value, args.Select(s => s.Value).ToArray())) }; + return new[] { new StepArgument(() => methodCallExpression.Method.Invoke(constantExpression.Value, stepArguments.Select(s => s.Value).ToArray())) }; - return new[] { new StepArgument(() => methodCallExpression.Method.Invoke(args.First().Value, args.Skip(1).Select(s => s.Value).ToArray())) }; + return new[] { new StepArgument(() => + { + var value = stepArguments.First().Value; + var parameters = stepArguments.Skip(1).Select(s => s.Value).ToArray(); + return methodCallExpression.Method.Invoke(value, parameters); + }) }; } - private static IEnumerable ExtractArguments(MethodCallExpression methodCallExpression, T value) + private static IEnumerable ExtractArguments(MethodCallExpression methodCallExpression, T value, bool extractArgsFromExpression = true) { var constants = new List(); foreach (var arg in methodCallExpression.Arguments) @@ -85,7 +91,10 @@ private static IEnumerable ExtractArguments(MethodCallExpressio constants.AddRange(ExtractArguments(arg, value)); } - constants.AddRange(ExtractArguments(methodCallExpression.Object, value)); + if (extractArgsFromExpression) + { + constants.AddRange(ExtractArguments(methodCallExpression.Object, value)); + } return constants; }