diff --git a/Plugins/SpecFlow.Windsor.SpecFlowPlugin/WindsorTestObjectResolver.cs b/Plugins/SpecFlow.Windsor.SpecFlowPlugin/WindsorTestObjectResolver.cs index e63e8d6cf..00e2a02b1 100644 --- a/Plugins/SpecFlow.Windsor.SpecFlowPlugin/WindsorTestObjectResolver.cs +++ b/Plugins/SpecFlow.Windsor.SpecFlowPlugin/WindsorTestObjectResolver.cs @@ -9,8 +9,12 @@ public class WindsorTestObjectResolver : ITestObjectResolver { public object ResolveBindingInstance(Type bindingType, IObjectContainer scenarioContainer) { - var componentContext = scenarioContainer.Resolve(); - return componentContext.Resolve(bindingType); + if (scenarioContainer.IsRegistered()) + { + var componentContext = scenarioContainer.Resolve(); + return componentContext.Resolve(bindingType); + } + return scenarioContainer.Resolve(bindingType); } } } diff --git a/Tests/TechTalk.SpecFlow.PluginTests/Infrastructure/WindsorPluginTests.cs b/Tests/TechTalk.SpecFlow.PluginTests/Infrastructure/WindsorPluginTests.cs index c02aa6206..31d3d8473 100644 --- a/Tests/TechTalk.SpecFlow.PluginTests/Infrastructure/WindsorPluginTests.cs +++ b/Tests/TechTalk.SpecFlow.PluginTests/Infrastructure/WindsorPluginTests.cs @@ -29,6 +29,22 @@ public void Can_load_Windsor_plugin() plugin.Should().NotBeNull(); } + [Fact] + public void Resolutions_are_not_forwarded_to_Windsor_before_it_is_registered() + { + var resolver = new WindsorTestObjectResolver(); + + var objectContainer = new Mock(); + var container = new Mock(); + objectContainer.Setup(x => x.IsRegistered()).Returns(false); + objectContainer.Setup(x => x.Resolve()).Returns(container.Object); + + resolver.ResolveBindingInstance(typeof(ITraceListener), objectContainer.Object); + + objectContainer.Verify(x => x.Resolve(typeof(ITraceListener), It.IsAny()), Times.Once); + container.Verify(x => x.Resolve(typeof(ITraceListener)), Times.Never); + } + [Fact] public void Resolutions_are_forwarded_to_Windsor() { @@ -36,10 +52,12 @@ public void Resolutions_are_forwarded_to_Windsor() var objectContainer = new Mock(); var container = new Mock(); + objectContainer.Setup(x => x.IsRegistered()).Returns(true); objectContainer.Setup(x => x.Resolve()).Returns(container.Object); resolver.ResolveBindingInstance(typeof(ITraceListener), objectContainer.Object); + objectContainer.Verify(x => x.Resolve(typeof(ITraceListener), It.IsAny()), Times.Never); container.Verify(x => x.Resolve(typeof(ITraceListener)), Times.Once); } diff --git a/changelog.txt b/changelog.txt index 87a244c40..15739190e 100644 --- a/changelog.txt +++ b/changelog.txt @@ -12,6 +12,7 @@ Fixes: + Fix Type or namespace [TestNamespace]_XunitAssemblyFixture could not be found #1825 + Fix Default value deserialization from specflow.json #2239 #2439 + Should not log error if TestAssembly does not have a RuntimePlugin attribute #2432 ++ Fixed context injection in static methods for Windsor plugin - Same as https://github.com/SpecFlowOSS/SpecFlow/issues/2307, but for Windsor 3.8