2010-08-10 4 views
3

J'ai une méthode appelée ProcessPayment() que je développe via BDD et mspec. J'ai besoin d'aide pour un nouveau défi. Mon histoire d'utilisateur dit:Comment développer un objet d'entrée avec TDD/BDD?

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

Pour mettre en place le contexte, je stubbing mon service de passerelle à l'aide Moq.

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

est ici la spécification:

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>()); 

} 

La méthode doit prendre un objet `PaymentProcessingRequest » (pas dans le domaine de obj), carte qui obj à un domaine obj et passer le domaine obj à la méthode bouchonné sur le service de passerelle. La réponse du service de passerelle est ce qui est renvoyé par la méthode. Cependant, en raison de la façon dont je suis en train de céder ma méthode de service de passerelle, il ne se soucie pas de ce qui est passé dedans. Par conséquent, il semble que je n'ai aucun moyen de tester si la méthode mappe correctement l'objet de requête à l'objet de domaine.

Quand puis-je faire ici et toujours adhérer à BDD?

Répondre

2

Pour vérifier que l'objet envoyé à votre IGatewayService est correct, vous pouvez utiliser un rappel pour définir une référence à l'objet de domaine. Vous pouvez ensuite écrire vos assertions sur les propriétés de cet objet.

Exemple:

_mockGatewayService 
      .Setup(x => x.Process(Moq.It.IsAny<PaymentInfo>()) 
      .Callback<PaymentInfo>(paymentInfo => _paymentInfo = paymentInfo); 
0

D'après ce que je comprends,
Vous voulez tester la logique de cartographie dans la méthode WebService.ProcessPayment; il y a un mappage d'un paramètre d'entrée A à un objet B, qui est utilisé comme entrée pour un collaborateur GateWayService.

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

Utilisez la contrainte moq It.Is qui prend dans un prédicats (un test pour l'argument de satisfaire). Implémentez CheckPaymentInfo pour vous opposer au PaymentInfo attendu.

par exemple. pour vérifier si Ajouter est passé un nombre pair comme argument,

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