Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System.Linq;
using System.Linq.Expressions;
using NUnit.Framework;
using Shouldly;

namespace TestStack.BDDfy.Tests.Scanner.FluentScanner
{
Expand Down Expand Up @@ -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>> action, ClassUnderTest instance)
Expand Down Expand Up @@ -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";
Expand Down
22 changes: 21 additions & 1 deletion TestStack.BDDfy.Tests/Scanner/FluentScanner/StepTitleTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public static IEnumerable<StepArgument> ExtractArguments<T>(this Expression<Acti
if (methodCallExpression == null)
throw new InvalidOperationException("Please provide a *method call* lambda expression.");

return ExtractArguments(methodCallExpression, value);
return ExtractArguments(methodCallExpression, value, false);
}

public static IEnumerable<StepArgument> ExtractArguments<T>(this Expression<Func<T, Task>> expression, T value)
Expand All @@ -33,7 +33,7 @@ public static IEnumerable<StepArgument> ExtractArguments<T>(this Expression<Func
if (methodCallExpression == null)
throw new InvalidOperationException("Please provide a *method call* lambda expression.");

return ExtractArguments(methodCallExpression, value);
return ExtractArguments(methodCallExpression, value, false);
}

private static IEnumerable<StepArgument> ExtractArguments<T>(Expression expression, T value)
Expand Down Expand Up @@ -71,21 +71,30 @@ private static IEnumerable<StepArgument> ExtractArguments<T>(Expression expressi
private static IEnumerable<StepArgument> Invoke(MethodCallExpression methodCallExpression, IEnumerable<StepArgument> 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<StepArgument> ExtractArguments<T>(MethodCallExpression methodCallExpression, T value)
private static IEnumerable<StepArgument> ExtractArguments<T>(MethodCallExpression methodCallExpression, T value, bool extractArgsFromExpression = true)
{
var constants = new List<StepArgument>();
foreach (var arg in methodCallExpression.Arguments)
{
constants.AddRange(ExtractArguments(arg, value));
}

constants.AddRange(ExtractArguments(methodCallExpression.Object, value));
if (extractArgsFromExpression)
{
constants.AddRange(ExtractArguments(methodCallExpression.Object, value));
}

return constants;
}
Expand Down