Skip to content

Commit

Permalink
RuntimePlugin Locator looks into TestAssembly folder (#1597)
Browse files Browse the repository at this point in the history
* as on .NET Core the SpecFlow.dll is not in the output folder and current directory is set to the TestResults folder, we have to search for runtime plugins in the test assembly folder

* fix unit tests
  • Loading branch information
SabotageAndi committed Jun 4, 2019
1 parent 1c0c77f commit f408485
Show file tree
Hide file tree
Showing 8 changed files with 22 additions and 10 deletions.
12 changes: 7 additions & 5 deletions TechTalk.SpecFlow/Infrastructure/ContainerBuilder.cs
@@ -1,6 +1,8 @@
using BoDi;
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using TechTalk.SpecFlow.Configuration;
using TechTalk.SpecFlow.Plugins;
using TechTalk.SpecFlow.Tracing;
Expand All @@ -10,7 +12,7 @@ namespace TechTalk.SpecFlow.Infrastructure
{
public interface IContainerBuilder
{
IObjectContainer CreateGlobalContainer(IRuntimeConfigurationProvider configurationProvider = null);
IObjectContainer CreateGlobalContainer(Assembly testAssembly, IRuntimeConfigurationProvider configurationProvider = null);
IObjectContainer CreateTestThreadContainer(IObjectContainer globalContainer);
IObjectContainer CreateScenarioContainer(IObjectContainer testThreadContainer, ScenarioInfo scenarioInfo);
IObjectContainer CreateFeatureContainer(IObjectContainer testThreadContainer, FeatureInfo featureInfo);
Expand All @@ -27,7 +29,7 @@ public ContainerBuilder(IDefaultDependencyProvider defaultDependencyProvider = n
_defaultDependencyProvider = defaultDependencyProvider ?? DefaultDependencyProvider;
}

public virtual IObjectContainer CreateGlobalContainer(IRuntimeConfigurationProvider configurationProvider = null)
public virtual IObjectContainer CreateGlobalContainer(Assembly testAssembly, IRuntimeConfigurationProvider configurationProvider = null)
{
var container = new ObjectContainer();
container.RegisterInstanceAs<IContainerBuilder>(this);
Expand All @@ -52,7 +54,7 @@ public virtual IObjectContainer CreateGlobalContainer(IRuntimeConfigurationProvi

var unitTestProviderConfigration = container.Resolve<UnitTestProviderConfiguration>();

LoadPlugins(configurationProvider, container, runtimePluginEvents, specFlowConfiguration, unitTestProviderConfigration);
LoadPlugins(configurationProvider, container, runtimePluginEvents, specFlowConfiguration, unitTestProviderConfigration, testAssembly);

runtimePluginEvents.RaiseConfigurationDefaults(specFlowConfiguration);

Expand Down Expand Up @@ -126,7 +128,7 @@ public IObjectContainer CreateFeatureContainer(IObjectContainer testThreadContai
}

protected virtual void LoadPlugins(IRuntimeConfigurationProvider configurationProvider, ObjectContainer container, RuntimePluginEvents runtimePluginEvents,
SpecFlowConfiguration specFlowConfiguration, UnitTestProviderConfiguration unitTestProviderConfigration)
SpecFlowConfiguration specFlowConfiguration, UnitTestProviderConfiguration unitTestProviderConfigration, Assembly testAssembly)
{
// initialize plugins that were registered from code
foreach (var runtimePlugin in container.Resolve<IDictionary<string, IRuntimePlugin>>().Values)
Expand All @@ -139,7 +141,7 @@ public IObjectContainer CreateFeatureContainer(IObjectContainer testThreadContai
var pluginLocator = container.Resolve<IRuntimePluginLocator>();
var pluginLoader = container.Resolve<IRuntimePluginLoader>();
var traceListener = container.Resolve<ITraceListener>();
foreach (var pluginPath in pluginLocator.GetAllRuntimePlugins())
foreach (var pluginPath in pluginLocator.GetAllRuntimePlugins(Path.GetDirectoryName(testAssembly?.Location)))
{
LoadPlugin(pluginPath, pluginLoader, runtimePluginEvents, unitTestProviderConfigration, traceListener);
}
Expand Down
1 change: 1 addition & 0 deletions TechTalk.SpecFlow/Plugins/IRuntimePluginLocator.cs
Expand Up @@ -8,5 +8,6 @@ namespace TechTalk.SpecFlow.Plugins
public interface IRuntimePluginLocator
{
IReadOnlyList<string> GetAllRuntimePlugins();
IReadOnlyList<string> GetAllRuntimePlugins(string testAssemblyLocation);
}
}
10 changes: 9 additions & 1 deletion TechTalk.SpecFlow/Plugins/RuntimePluginLocator.cs
Expand Up @@ -17,13 +17,21 @@ public RuntimePluginLocator(IRuntimePluginLocationMerger runtimePluginLocationMe
}

public IReadOnlyList<string> GetAllRuntimePlugins()
{
return GetAllRuntimePlugins(null);
}

public IReadOnlyList<string> GetAllRuntimePlugins(string testAssemblyLocation)
{
var allRuntimePlugins = new List<string>();

allRuntimePlugins.AddRange(SearchPluginsInFolder(Environment.CurrentDirectory));
allRuntimePlugins.AddRange(SearchPluginsInFolder(_pathToFolderWithSpecFlowAssembly));


if (testAssemblyLocation.IsNotNullOrWhiteSpace())
{
allRuntimePlugins.AddRange(SearchPluginsInFolder(testAssemblyLocation));
}

return _runtimePluginLocationMerger.Merge(allRuntimePlugins.Distinct().ToList());
}
Expand Down
2 changes: 1 addition & 1 deletion TechTalk.SpecFlow/TestRunnerManager.cs
Expand Up @@ -204,7 +204,7 @@ private static ITestRunnerManager CreateTestRunnerManager(Assembly testAssembly,
{
containerBuilder = containerBuilder ?? new ContainerBuilder();

var container = containerBuilder.CreateGlobalContainer();
var container = containerBuilder.CreateGlobalContainer(testAssembly);
var testRunnerManager = container.Resolve<ITestRunnerManager>();
testRunnerManager.Initialize(testAssembly);
return testRunnerManager;
Expand Down
Expand Up @@ -309,6 +309,7 @@ public override void RegisterGlobalContainerDefaults(BoDi.ObjectContainer contai

var runtimePluginLocator = new Mock<IRuntimePluginLocator>();
runtimePluginLocator.Setup(m => m.GetAllRuntimePlugins()).Returns(new List<string>() { "aPlugin" });
runtimePluginLocator.Setup(m => m.GetAllRuntimePlugins(It.IsAny<string>())).Returns(new List<string>() { "aPlugin" });


var pluginLoaderStub = new Mock<IRuntimePluginLoader>();
Expand Down
Expand Up @@ -57,7 +57,7 @@ public void Should_be_able_to_resolve_from_scenario_container()
// this basically tests the special registration in DefaultDependencyProvider

var containerBuilder = new ContainerBuilder();
var testThreadContainer = containerBuilder.CreateTestThreadContainer(containerBuilder.CreateGlobalContainer());
var testThreadContainer = containerBuilder.CreateTestThreadContainer(containerBuilder.CreateGlobalContainer(typeof(TestThreadContextTests).Assembly));
var contextManager = CreateContextManager(testThreadContainer);
contextManager.InitializeFeatureContext(new FeatureInfo(FeatureLanguage, "test feature", null));
contextManager.InitializeScenarioContext(new ScenarioInfo("test scenario", "test_description"));
Expand Down
Expand Up @@ -41,7 +41,7 @@ internal static IObjectContainer CreateDefaultFeatureContainer(StringConfigProvi

private static IObjectContainer CreateDefaultGlobalContainer(IRuntimeConfigurationProvider configurationProvider, Action<IObjectContainer> registerGlobalMocks, ContainerBuilder instance)
{
var globalContainer = instance.CreateGlobalContainer(configurationProvider);
var globalContainer = instance.CreateGlobalContainer(typeof(TestObjectFactories).Assembly, configurationProvider);
registerGlobalMocks?.Invoke(globalContainer);
return globalContainer;
}
Expand Down
Expand Up @@ -16,7 +16,7 @@ public class TestRunnerManagerTest

public TestRunnerManagerTest()
{
var globalContainer = new ContainerBuilder().CreateGlobalContainer();
var globalContainer = new ContainerBuilder().CreateGlobalContainer(typeof(TestRunnerManagerTest).Assembly);
testRunnerManager = globalContainer.Resolve<TestRunnerManager>();
testRunnerManager.Initialize(anAssembly);
}
Expand Down

0 comments on commit f408485

Please sign in to comment.