public CustomerRegistrationTests()
        {
            var mapper = AutomapperConfiguration.Init();

            _customerRepository = Substitute.For <ICustomerRepository>();
            _creditCardGateway  = Substitute.For <ICreditCardGateway>();
            _mailConfirmer      = Substitute.For <IMailConfirmer>();

            // Default objects ('stubs')
            var customer = Mocks.GetCustomer();

            _vm = Mocks.GetCreateCustomerViewModel();
            _creditCardGatewayResponse = Mocks.GetCreditCardGatewayResponse();

            // Default system under test ('sut')
            _sut = new CustomerRegistration(mapper, _customerRepository,
                                            _mailConfirmer, _creditCardGateway);

            // Default Behaviour
            _customerRepository.Create(Arg.Any <Customer>()).Returns(customer);
            _customerRepository.CreateRop(Arg.Any <Customer>()).Returns(Result.Ok(customer));
            _customerRepository.UpgradeToPremium(Arg.Any <Customer>()).Returns(Result.Ok(customer));
            _creditCardGateway.Charge(Arg.Any <string>()).Returns(_creditCardGatewayResponse);
            _creditCardGateway.ChargeRop(Arg.Any <string>()).Returns(Result.Ok(_creditCardGatewayResponse));
            _creditCardGateway.RollBackLastTransactionRop(Arg.Any <Customer>()).Returns(Result.Ok(customer));

            _mailConfirmer.SendWelcomeRop(Arg.Any <Customer>()).Returns(Result.Ok(customer));
        }
Beispiel #2
0
        // Using Railway Oriented Programming
        private CustomerCreatedViewModel RegisterCustomer5_ROP(
            CreateCustomerViewModel createCustomerViewModel)
        {
            var result = ValidateRop(createCustomerViewModel)
                         .OnSuccess(c => _customerRepository.CreateRop(c))
                         .OnSuccess(c => createCustomerViewModel.WantsPremiumSupport
                    ? _creditCardGateway.ChargeRop(c.CreditCardNumber)
                                    .OnSuccess(gateway => gateway.ChargeWasBooked
                            ? _customerRepository.UpgradeToPremium(c)
                            : _creditCardGateway.RollBackLastTransactionRop(c))
                    : Result.Ok(c))
                         .OnSuccess(c => _mailConfirmer.SendWelcomeRop(c))
                         .OnBoth(cResultAtEnd => cResultAtEnd.IsSuccess
                    ? new CustomerCreatedViewModel(cResultAtEnd.Value.Id)
                    : CreateErrorResponseRop(cResultAtEnd.Error));

            return(result);
        }