Skip to content

Commit ef6718e

Browse files
authored
[DI] DI fails to throw an exception when DI tried to create an actor with missing constructor parameter (#5735)
* Add bug spec for DI bug * Fix unit test to reflect the correct failure behaviour
1 parent 5ef69e9 commit ef6718e

File tree

1 file changed

+101
-0
lines changed
  • src/contrib/dependencyinjection/Akka.DependencyInjection.Tests

1 file changed

+101
-0
lines changed
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
// //-----------------------------------------------------------------------
2+
// // <copyright file="BugFix.cs" company="Akka.NET Project">
3+
// // Copyright (C) 2009-2022 Lightbend Inc. <http://www.lightbend.com>
4+
// // Copyright (C) 2013-2022 .NET Foundation <https://github.com/akkadotnet/akka.net>
5+
// // </copyright>
6+
// //-----------------------------------------------------------------------
7+
8+
using System;
9+
using System.Threading;
10+
using System.Threading.Tasks;
11+
using Akka.Actor;
12+
using Akka.Event;
13+
using Akka.TestKit;
14+
using Microsoft.Extensions.DependencyInjection;
15+
using Microsoft.Extensions.Hosting;
16+
using Xunit;
17+
using Xunit.Abstractions;
18+
using FluentAssertions;
19+
using static FluentAssertions.FluentActions;
20+
21+
namespace Akka.DependencyInjection.Tests
22+
{
23+
public class BugFixSpec: AkkaSpec, IAsyncLifetime
24+
{
25+
private readonly IServiceProvider _serviceProvider;
26+
private readonly AkkaService _akkaService;
27+
28+
public BugFixSpec(ITestOutputHelper output) : base(output)
29+
{
30+
var services = new ServiceCollection()
31+
.AddSingleton<AkkaService>()
32+
.AddHostedService<AkkaService>();
33+
34+
_serviceProvider = services.BuildServiceProvider();
35+
_akkaService = _serviceProvider.GetRequiredService<AkkaService>();
36+
}
37+
38+
[Fact(DisplayName = "DI should log an error if DI provider does not contain required parameter")]
39+
public void ShouldLogAnErrorIfParameterInjectionFailed()
40+
{
41+
var system = _serviceProvider.GetRequiredService<AkkaService>().ActorSystem;
42+
var probe = CreateTestProbe(system);
43+
system.EventStream.Subscribe(probe, typeof(Error));
44+
45+
var props = DependencyResolver.For(system).Props<TestDiActor>();
46+
var actor = system.ActorOf(props.WithDeploy(Deploy.Local), "testDIActor");
47+
48+
probe.ExpectMsg<Error>().Cause.Should().BeOfType<ActorInitializationException>();
49+
}
50+
51+
internal class TestDiActor : ReceiveActor
52+
{
53+
public TestDiActor(NotInServices doesNotExistInDi)
54+
{
55+
}
56+
}
57+
58+
internal class NotInServices
59+
{
60+
}
61+
62+
63+
public async Task InitializeAsync()
64+
{
65+
await _akkaService.StartAsync(default);
66+
InitializeLogger(_akkaService.ActorSystem);
67+
}
68+
69+
public async Task DisposeAsync()
70+
{
71+
var sys = _serviceProvider.GetRequiredService<AkkaService>().ActorSystem;
72+
await sys.Terminate();
73+
}
74+
75+
internal class AkkaService : IHostedService
76+
{
77+
public ActorSystem ActorSystem { get; private set; }
78+
79+
private readonly IServiceProvider _serviceProvider;
80+
81+
public AkkaService(IServiceProvider serviceProvider)
82+
{
83+
_serviceProvider = serviceProvider;
84+
}
85+
86+
public Task StartAsync(CancellationToken cancellationToken)
87+
{
88+
var setup = DependencyResolverSetup.Create(_serviceProvider)
89+
.And(BootstrapSetup.Create().WithConfig(TestKitBase.DefaultConfig));
90+
91+
ActorSystem = ActorSystem.Create("TestSystem", setup);
92+
return Task.CompletedTask;
93+
}
94+
95+
public async Task StopAsync(CancellationToken cancellationToken)
96+
{
97+
await ActorSystem.Terminate();
98+
}
99+
}
100+
}
101+
}

0 commit comments

Comments
 (0)