Skip to content

Commit b25f3f0

Browse files
committed
Fixed unit tests by adding a scope provider
1 parent 16c3e0f commit b25f3f0

File tree

5 files changed

+54
-3
lines changed

5 files changed

+54
-3
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using Microsoft.Extensions.DependencyInjection;
2+
3+
namespace WorkflowCore.Interface
4+
{
5+
/// <remarks>
6+
/// The implemention of this interface will be responsible for
7+
/// providing a new service scope for a DI container
8+
/// </remarks>
9+
public interface IScopeProvider
10+
{
11+
/// <summary>
12+
/// Create a new service scope
13+
/// </summary>
14+
/// <returns></returns>
15+
IServiceScope CreateScope();
16+
}
17+
}

src/WorkflowCore/ServiceCollectionExtensions.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ public static IServiceCollection AddWorkflow(this IServiceCollection services, A
4646

4747
services.AddSingleton<IWorkflowController, WorkflowController>();
4848
services.AddSingleton<IWorkflowHost, WorkflowHost>();
49+
services.AddTransient<IScopeProvider, ScopeProvider>();
4950
services.AddTransient<IWorkflowExecutor, WorkflowExecutor>();
5051
services.AddTransient<ICancellationProcessor, CancellationProcessor>();
5152
services.AddTransient<IWorkflowBuilder, WorkflowBuilder>();
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using Microsoft.Extensions.DependencyInjection;
2+
using System;
3+
using WorkflowCore.Interface;
4+
5+
namespace WorkflowCore.Services
6+
{
7+
/// <summary>
8+
/// A concrete implementation for the IScopeProvider interface
9+
/// Largely to get around the problems of unit testing an extension method (CreateScope())
10+
/// </summary>
11+
public class ScopeProvider : IScopeProvider
12+
{
13+
private readonly IServiceProvider provider;
14+
15+
public ScopeProvider(IServiceProvider provider)
16+
{
17+
this.provider = provider;
18+
}
19+
20+
public IServiceScope CreateScope()
21+
{
22+
return provider.CreateScope();
23+
}
24+
}
25+
}

src/WorkflowCore/Services/WorkflowExecutor.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public class WorkflowExecutor : IWorkflowExecutor
1414
{
1515
protected readonly IWorkflowRegistry _registry;
1616
protected readonly IServiceProvider _serviceProvider;
17+
protected readonly IScopeProvider _scopeProvider;
1718
protected readonly IDateTimeProvider _datetimeProvider;
1819
protected readonly ILogger _logger;
1920
private readonly IExecutionResultProcessor _executionResultProcessor;
@@ -23,9 +24,10 @@ public class WorkflowExecutor : IWorkflowExecutor
2324

2425
private IWorkflowHost Host => _serviceProvider.GetService<IWorkflowHost>();
2526

26-
public WorkflowExecutor(IWorkflowRegistry registry, IServiceProvider serviceProvider, IDateTimeProvider datetimeProvider, IExecutionResultProcessor executionResultProcessor, ILifeCycleEventPublisher publisher, ICancellationProcessor cancellationProcessor, WorkflowOptions options, ILoggerFactory loggerFactory)
27+
public WorkflowExecutor(IWorkflowRegistry registry, IServiceProvider serviceProvider, IScopeProvider scopeProvider, IDateTimeProvider datetimeProvider, IExecutionResultProcessor executionResultProcessor, ILifeCycleEventPublisher publisher, ICancellationProcessor cancellationProcessor, WorkflowOptions options, ILoggerFactory loggerFactory)
2728
{
2829
_serviceProvider = serviceProvider;
30+
_scopeProvider = scopeProvider;
2931
_registry = registry;
3032
_datetimeProvider = datetimeProvider;
3133
_publisher = publisher;
@@ -87,7 +89,7 @@ public async Task<WorkflowExecutorResult> Execute(WorkflowInstance workflow)
8789
pointer.StartTime = _datetimeProvider.Now.ToUniversalTime();
8890
}
8991

90-
using (var scope = _serviceProvider.CreateScope())
92+
using (var scope = _scopeProvider.CreateScope())
9193
{
9294
_logger.LogDebug("Starting step {0} on workflow {1}", step.Name, workflow.Id);
9395

test/WorkflowCore.UnitTests/Services/WorkflowExecutorFixture.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public class WorkflowExecutorFixture
2525
protected ILifeCycleEventPublisher EventHub;
2626
protected ICancellationProcessor CancellationProcessor;
2727
protected IServiceProvider ServiceProvider;
28+
protected IScopeProvider ScopeProvider;
2829
protected IDateTimeProvider DateTimeProvider;
2930
protected WorkflowOptions Options;
3031

@@ -33,6 +34,7 @@ public WorkflowExecutorFixture()
3334
Host = A.Fake<IWorkflowHost>();
3435
PersistenceProvider = A.Fake<IPersistenceProvider>();
3536
ServiceProvider = A.Fake<IServiceProvider>();
37+
ScopeProvider = A.Fake<IScopeProvider>();
3638
Registry = A.Fake<IWorkflowRegistry>();
3739
ResultProcesser = A.Fake<IExecutionResultProcessor>();
3840
EventHub = A.Fake<ILifeCycleEventPublisher>();
@@ -41,13 +43,17 @@ public WorkflowExecutorFixture()
4143

4244
Options = new WorkflowOptions(A.Fake<IServiceCollection>());
4345

46+
var scope = A.Fake<IServiceScope>();
47+
A.CallTo(() => ScopeProvider.CreateScope()).Returns(scope);
48+
A.CallTo(() => scope.ServiceProvider).Returns(ServiceProvider);
49+
4450
A.CallTo(() => DateTimeProvider.Now).Returns(DateTime.Now);
4551

4652
//config logging
4753
var loggerFactory = new LoggerFactory();
4854
loggerFactory.AddConsole(LogLevel.Debug);
4955

50-
Subject = new WorkflowExecutor(Registry, ServiceProvider, DateTimeProvider, ResultProcesser, EventHub, CancellationProcessor, Options, loggerFactory);
56+
Subject = new WorkflowExecutor(Registry, ServiceProvider, ScopeProvider, DateTimeProvider, ResultProcesser, EventHub, CancellationProcessor, Options, loggerFactory);
5157
}
5258

5359
[Fact(DisplayName = "Should execute active step")]

0 commit comments

Comments
 (0)