diff --git a/src/TestStack.BDDfy.Tests/Scanner/FluentScanner/AmbiguousHeaderMatchTests.cs b/src/TestStack.BDDfy.Tests/Scanner/FluentScanner/AmbiguousHeaderMatchTests.cs new file mode 100644 index 0000000..7e530df --- /dev/null +++ b/src/TestStack.BDDfy.Tests/Scanner/FluentScanner/AmbiguousHeaderMatchTests.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using Shouldly; +using Xunit; + +namespace TestStack.BDDfy.Tests.Scanner.FluentScanner +{ + public class AmbiguousHeaderMatchTests + { + private int _count; + + [Fact] + public void ThrowsWhenMultipleHeadersMatchParameterName() + { + // Act & Assert + var exception = Should.Throw(() => + { + this.Given(_ => GivenInput(_count)) // Will try to bind _count to both "count" and "Count" headers + .WithExamples(new ExampleTable("count", "Count") // Deliberately ambiguous headers + { + { 5, 10 } + }) + .BDDfy(); + }); + + exception.Message.ShouldBe("More than one headers for examples, match the parameter 'count' provided for 'GivenInput'"); + } + + private void GivenInput(int count) + { + // The method exists just to trigger the ambiguous header match + } + } +} \ No newline at end of file diff --git a/src/TestStack.BDDfy/Scanners/StepScanners/Fluent/FluentScanner.cs b/src/TestStack.BDDfy/Scanners/StepScanners/Fluent/FluentScanner.cs index a97b35a..1a09ab1 100644 --- a/src/TestStack.BDDfy/Scanners/StepScanners/Fluent/FluentScanner.cs +++ b/src/TestStack.BDDfy/Scanners/StepScanners/Fluent/FluentScanner.cs @@ -203,9 +203,15 @@ private StepTitle CreateTitle(string stepTextTemplate, bool includeInputsInStepT { if (_testContext.Examples != null) { - var matchingHeader = _testContext.Examples.Headers - .SingleOrDefault(header => ExampleTable.HeaderMatches(header, i.ParameterName) || - ExampleTable.HeaderMatches(header, i.Value.Name)); + var matchingHeaders = _testContext.Examples.Headers + .Where(header => ExampleTable.HeaderMatches(header, i.ParameterName) || + ExampleTable.HeaderMatches(header, i.Value.Name)) + .ToList(); + + if (matchingHeaders.Count > 1) + throw new AmbiguousMatchException ($"More than one headers for examples, match the parameter '{i.ParameterName}' provided for '{methodInfo.Name}'"); + + var matchingHeader = matchingHeaders.SingleOrDefault(); if (matchingHeader != null) return string.Format("<{0}>", matchingHeader); }