public async Task Process_PaymentRequest_ReturnsPaymentResponse() { // Arrange var logger = Substitute.For <ILogger <PaymentsController> >(); var paymentRequestProcessorSub = Substitute.For <IPaymentRequestProcessor>(); var paymentRequestDto = new PaymentRequestDto { MerchantId = 0, CardHolderName = "John Smith", CardNumber = "1234 1234 1234 1234", Amount = 100.00M, Currency = "GBP", CVV = "123", ExpiryDate = DateTime.Now }; var money = new Money(paymentRequestDto.Amount, paymentRequestDto.Currency); var acquiringBankPaymentId = Guid.NewGuid().ToString(); var timestamp = DateTime.Now; paymentRequestProcessorSub .Process(Arg.Is <PaymentRequest>(p => p.CardNumber == paymentRequestDto.CardNumber.Replace(" ", string.Empty))) .Returns(Task.FromResult(new Payment(1, 100, "John Smith", "123412******1234", paymentRequestDto.ExpiryDate, money, acquiringBankPaymentId, PaymentStatus.Approved, timestamp))); var paymentFinderSub = Substitute.For <IPaymentFinder>(); var controller = new PaymentsController(paymentRequestProcessorSub, paymentFinderSub, logger); // Act var response = await controller.Process(paymentRequestDto); // Assert Assert.NotNull(response); Assert.NotNull(response.Result); Assert.IsType <OkObjectResult>(response.Result); var result = (OkObjectResult)response.Result; var value = (PaymentResponseDto)result.Value; Assert.Equal(value.AcquiringBankPaymentId, acquiringBankPaymentId); Assert.Equal(value.Status, PaymentStatus.Approved.ToString()); Assert.Equal(value.Timestamp, timestamp); }