public async Task one_failing_handler_should_not_abort_others() { var container = Substitute.For <IContainer>(); var scope = Substitute.For <IContainerScope>(); var evt = new IocEventBusTests.TestEvent(); var successHandler = new IocEventBusTests.SuccessfulHandler(); Exception actual = null; container.CreateScope().Returns(scope); scope.ResolveAll <IApplicationEventSubscriber <IocEventBusTests.TestEvent> >() .Returns(new IApplicationEventSubscriber <IocEventBusTests.TestEvent>[] { new IocEventBusTests.FailingHandler(), successHandler }); var inner = new IocEventBus(container); var sut = new QueuedEventBus(inner, 1); try { await sut.PublishAsync(evt); await sut.ExecuteJobAsync(); } catch (Exception exception) { actual = exception; } successHandler.IsCalled.Should().BeTrue(); actual.Should().BeOfType <AggregateException>(); }
public IEventBus CreateEventBus(IContainer container) { // should not happen, but does sometimes. // seems related to Mvc contra WebApi // but can't figure out why if (_eventBus != null) { return(_eventBus); } _registry.ScanAssembly(typeof(ValidateNewLoginHandler).Assembly); _registry.ScanAssembly(typeof(UserRepository).Assembly); _registry.ScanAssembly(typeof(ScanForNewErrorReports).Assembly); //var inner = new SeparateScopesIocEventBus(container, _registry); var inner = new IocEventBus(container); inner.EventPublished += (sender, args) => CloseUnitOfWorks(args.Scope); //inner.ScopeClosing += (sender, args) => CloseUnitOfWorks(args.Scope); inner.HandlerFailed += (sender, args) => { foreach (var failure in args.Failures) { _log.Error(failure.Handler.GetType().FullName + " failed to handle " + args.ApplicationEvent, failure.Exception); } }; var bus = new QueuedEventBus(inner, _queueProvider); _eventBus = bus; return(bus); }
public async Task event_should_report_Failure_if_one_handler_throws_an_exception() { var container = Substitute.For <IContainer>(); var scope = Substitute.For <IContainerScope>(); var actual = false; container.CreateScope().Returns(scope); scope.ResolveAll <IApplicationEventSubscriber <IocEventBusTests.TestEvent> >() .Returns(new[] { Substitute.For <IApplicationEventSubscriber <IocEventBusTests.TestEvent> >(), new IocEventBusTests.FailingHandler(), }); var inner = new IocEventBus(container); var sut = new QueuedEventBus(inner, 1); sut.EventPublished += (sender, args) => actual = args.Successful; try { sut.PublishAsync(new IocEventBusTests.TestEvent()); } catch { } actual.Should().BeFalse(); }
/// <summary> /// Initializes a new instance of the <see cref="IocBusBuilder" /> class. /// </summary> /// <param name="container">The container.</param> public IocBusBuilder(IContainer container) { if (container == null) throw new ArgumentNullException("container"); _container = container; CommandBus = new IocCommandBus(_container); RequestBus = new IocRequestReplyBus(container); EventBus = new IocEventBus(container); QueryBus = new IocQueryBus(container); }
public async Task works_without_subscribers_since_there_is_no_coupling_between_the_publisher_and_subscribers() { var container = Substitute.For <IContainer>(); var scope = Substitute.For <IContainerScope>(); container.CreateScope().Returns(scope); scope.ResolveAll <IApplicationEventSubscriber <TestEvent> >() .Returns(new IApplicationEventSubscriber <TestEvent> [0]); var sut = new IocEventBus(container); await sut.PublishAsync(new TestEvent()); }
public async Task should_dispose_scope_when_done() { var container = Substitute.For <IContainer>(); var scope = Substitute.For <IContainerScope>(); container.CreateScope().Returns(scope); scope.ResolveAll <IApplicationEventSubscriber <TestEvent> >() .Returns(new[] { Substitute.For <IApplicationEventSubscriber <TestEvent> >(), }); var sut = new IocEventBus(container); await sut.PublishAsync(new TestEvent()); scope.Received().Dispose(); }
public async Task works_with_multiple_handlers() { var container = Substitute.For <IContainer>(); var scope = Substitute.For <IContainerScope>(); var subscriber1 = Substitute.For <IApplicationEventSubscriber <TestEvent> >(); var subscriber2 = Substitute.For <IApplicationEventSubscriber <TestEvent> >(); var evt = new TestEvent(); container.CreateScope().Returns(scope); scope.ResolveAll <IApplicationEventSubscriber <TestEvent> >() .Returns(new[] { subscriber1, subscriber2 }); var sut = new IocEventBus(container); await sut.PublishAsync(evt); subscriber1.Received().HandleAsync(evt); subscriber2.Received().HandleAsync(evt); }
public async Task should_trigger_event_upon_successful_completion() { var container = Substitute.For <IContainer>(); var scope = Substitute.For <IContainerScope>(); var actual = false; container.CreateScope().Returns(scope); scope.ResolveAll <IApplicationEventSubscriber <TestEvent> >() .Returns(new[] { Substitute.For <IApplicationEventSubscriber <TestEvent> >(), }); var sut = new IocEventBus(container); sut.EventPublished += (sender, args) => actual = true; await sut.PublishAsync(new TestEvent()); actual.Should().BeTrue(); }