public async Task ProcessPaymentAsync_ForValidRequestHavingAmountGreaterThan500AndPremiumFailsFirst2TimesAndPassedNextTime_PremiumGatewayIsCalled3TimesAndReturnsProcessedStatusAsync() { //Arrange var model = GetPaymentRequestModel(550); _premiumPaymentGateway.ProcessPaymentAsync(Arg.Any <PaymentRequestModel>()) .Returns(x => throw new Exception(), x => throw new Exception(), x => Task.FromResult(PaymentStatus.Processed)); _unitOfWork.PaymentsRepository.When(x => x.AddAsync(Arg.Any <PaymentEntities.Entities.Payment>())).Do(x => { }); _unitOfWork.When(x => x.Complete()).Do(x => { }); //Act var actual = await _paymentBusiness.ProcessPaymentAsync(model); //Assert Assert.AreEqual(PaymentStatus.Processed, actual); _serviceAccessor.Received(2).Invoke(Arg.Any <string>()); await _cheapPaymentGateway.Received(0).ProcessPaymentAsync(Arg.Any <PaymentRequestModel>()); await _expensivePaymentGateway.Received(0).ProcessPaymentAsync(Arg.Any <PaymentRequestModel>()); await _expensivePaymentGateway.Received(0).IsAvailableAsync(); await _premiumPaymentGateway.Received(3).ProcessPaymentAsync(Arg.Any <PaymentRequestModel>()); await _unitOfWork.PaymentsRepository.Received(1).AddAsync(Arg.Any <PaymentEntities.Entities.Payment>()); _unitOfWork.Received(1).Complete(); _logger.Received(2).LogError(Arg.Any <Exception>()); }