public async Task ProcessPaymentAsync_ForValidRequestHavingAmountGreaterThan20AndLessThan500_ExpensiveGatewayIsCalledAndReturnsProcessedStatusAsync() { //Arrange var model = GetPaymentRequestModel(25); _expensivePaymentGateway.IsAvailableAsync() .Returns(Task.FromResult(true)); _expensivePaymentGateway.ProcessPaymentAsync(Arg.Any <PaymentRequestModel>()) .Returns(Task.FromResult(PaymentStatus.Processed)); _unitOfWork.PaymentsRepository.When(x => x.AddAsync(Arg.Any <PaymentEntities.Entities.Payment>())).Do(x => { }); _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(1).Invoke(Arg.Any <string>()); await _cheapPaymentGateway.Received(0).ProcessPaymentAsync(Arg.Any <PaymentRequestModel>()); await _expensivePaymentGateway.Received(1).IsAvailableAsync(); await _expensivePaymentGateway.Received(1).ProcessPaymentAsync(Arg.Any <PaymentRequestModel>()); await _unitOfWork.PaymentsRepository.Received(1).AddAsync(Arg.Any <PaymentEntities.Entities.Payment>()); _unitOfWork.Received(1).Complete(); }