public async Task RunInBackgroundAsync_Using_OnFatalError() { Exception fakeException = new Exception(); Exception fatalError = null; //set up processor to throw var mockLogProcessor = new Mock <ILogProcessor>(); mockLogProcessor .Setup(s => s.ProcessLogsAsync(It.IsAny <FilterLog[]>())) .ThrowsAsync(fakeException); var web3Mock = new Web3Mock(); var logs = new[] { new FilterLog() }; web3Mock.GetLogsMock .Setup(p => p.SendRequestAsync(It.IsAny <NewFilterInput>(), null)) .ReturnsAsync(logs); web3Mock.BlockNumberMock .Setup(p => p.SendRequestAsync(null)) .ReturnsAsync(100.ToHexBigInteger()); var cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(10)); var processor = new LogsProcessorBuilder(web3Mock.Eth) .Set(p => p.BlocksPerBatch = 1) .Set(p => p.MinimumBlockNumber = 0) .OnFatalError(e => fatalError = e) .Add(mockLogProcessor.Object) .Build(); var backgroundTask = processor.ProcessContinuallyInBackgroundAsync(cancellationTokenSource.Token); //simulate doing some work until cancellation is requested while (!backgroundTask.IsCompleted) { await Task.Delay(100); } Assert.Same(fakeException, fatalError); }