Как разработать входной объект с TDD / BDD? - PullRequest
3 голосов
/ 11 августа 2010

У меня есть метод с именем ProcessPayment(), который я разрабатываю через BDD и mspec.Мне нужна помощь с новым вызовом.Моя пользовательская история гласит:

Given a payment processing context,
When payment is processed with valid payment information,
Then it should return a successful gateway response code.

Чтобы настроить контекст, я отключаю службу шлюза с помощью Moq.

_mockGatewayService = Mock<IGatewayService>();
_mockGatewayService.Setup(x => x.Process(Moq.It.IsAny<PaymentInfo>()).Returns(100);

Вот спецификация:

public class when_payment_is_processed_with_valid_information {

    static WebService _webService;
    static int _responseCode;
    static Mock<IGatewayService> _mockGatewayService;
    static PaymentProcessingRequest _paymentProcessingRequest;

    Establish a_payment_processing_context = () => {

        _mockGatewayService = Mock<IGatewayService>();
        _mockGatewayService
            .Setup(x => x.Process(Moq.It.IsAny<PaymentInfo>())
            .Returns(100);

        _webService = new WebService(_mockGatewayService.Object);

        _paymentProcessingRequest = new PaymentProcessingRequest();
    };

    Because payment_is_processed_with_valid_payment_information = () => 
        _responseCode = _webService.ProcessPayment(_paymentProcessingRequest); 

    It should_return_a_successful_gateway_response_code = () => 
        _responseCode.ShouldEqual(100);

    It should_hit_the_gateway_to_process_the_payment = () => 
        _mockGatewayService.Verify(x => x.Process(Moq.It.IsAny<PaymentInfo>());

}

Метод должен взять объект `PaymentProcessingRequest '(не домен obj), сопоставить этот объект obj с доменом и передать домен objк методу stubbed на службе шлюза.Ответ от службы шлюза - это то, что возвращается методом.Однако из-за того, как я заглушаю свой метод обслуживания шлюза, мне все равно, что ему передают.В результате, кажется, у меня нет возможности проверить, правильно ли метод сопоставляет объект запроса с объектом домена.

Когда я смогу поступить здесь и по-прежнему придерживаться BDD?

Ответы [ 2 ]

2 голосов
/ 11 августа 2010

Чтобы проверить, что объект, отправленный на ваш IGatewayService, является правильным, вы можете использовать обратный вызов, чтобы установить ссылку на объект домена.Затем вы можете написать свои утверждения о свойствах этого объекта.

Пример:

_mockGatewayService
            .Setup(x => x.Process(Moq.It.IsAny<PaymentInfo>())
            .Callback<PaymentInfo>(paymentInfo => _paymentInfo = paymentInfo);
0 голосов
/ 11 августа 2010

Итак, насколько я понимаю,
Вы хотите проверить логику отображения в методе WebService.ProcessPayment;существует сопоставление входного параметра A с объектом B, который используется в качестве входа для сотрудника GateWayService.

It should_hit_the_gateway_to_process_the_payment = () => 
        _mockGatewayService.Verify(
             x => x.Process( Moq.It.Is<PaymentInfo>( info => CheckPaymentInfo(info) ));

Используйте ограничение Moq It.Is, которое принимает предикат (критерий для удовлетворения аргумента).Реализуйте CheckPaymentInfo для подтверждения ожидаемой PaymentInfo.

, например, чтобы проверить, передается ли Add четное число в качестве аргумента,

 mock.Setup(foo => foo.Add(It.Is<int>(i => i % 2 == 0))).Returns(true); 
...