Как проверить асинхронные исключения в Akka.NET-акторе с ReceiveAsync - PullRequest
0 голосов
/ 22 октября 2019

У меня есть блок try / catch как в моем приложении, так и в модульном тесте. Я пытаюсь создать тест, который ловит исключение, выдаваемое моим актером. При отладке кода я получаю исключение, но в моем тесте я никогда не получаю исключение.

Приложение:

public class FooActor : ReceiveActor {
    private readonly IFooService fooService;
    private readonly IChildActorFactory childCreatorFactory;
    private IActorRef barActor;

    public FooActor(IFooService fooService, IChildActorFactory childCreatorFactory) {   
        this.fooService = fooService;
        this.childCreatorFactory = childCreatorFactory;

        ReceiveAsync<bool>(async (x) => await StartAsync(x).ConfigureAwait(false));
    }

    protected override void PreStart() {
        barActor = childCreatorFactory.Create<BarActor>(Context, "BarActor");
    }

    public async Task StartAsync(bool start) {
        try {
            if (start) {
                var fooInformation = await fooService.GetInformationAsync().ConfigureAwait(false);

                if (fooInformation != null) {
                    barActor.Tell(fooInformation);
                }
            }
        } catch (Exception exception) {
            throw new Exception($"Unhandled exception. Actor {Self.Path.Name};", exception);
        }
    }
}

Тест:

[Fact]
public void StartAsync_ThrowsException_ExceptionThrown() {
    using (var mock = AutoMock.GetLoose()) {
        //Arrange
        Sys.UseAutofac(mock.Container);
        var mockChildActorFactory = mock.Mock<IChildActorFactory>();
        var mockBarService = mock.Mock<IBarService>();

        mockBarService.Setup(x => x.GetInformationAsync()).Throws(new Exception());

        var props = Props.Create(() => new FooActor(mockBarService.Object, mockChildActorFactory.Object));

        var fooActorName = "FooActor";
        var fooActor = new TestActorRef<FooActor>(Sys, props, null, fooActorName);

        try {
            // Act
            fooActor.Receive(true);
        } catch (Exception exception) {
            // Assert
            Assert.Equal($"Unhandled Exception. Actor { fooActorName }.", exception.Message);
        }
    }
}
...