2010-09-03 7 views
2

J'ai croix publié ce billet sur le groupe de discussion #moq à: http://groups.google.com/group/moqdisc/browse_thread/thread/569b75fd2cc1829dparamètres ref Mocking

hey les gens,

Je suis tombé sur un problème avec un param ref moquée que je suis sûr doit être évident, mais étant nouveau pour le cadre, je ne peux pas le travailler .

J'ai la méthode référentiel suivante:

public int SaveCard(int userId, CardPaymentMethodDto 
cardPaymentMethodDto) 
{ 
     int? cardId = 0; 
     try 
     { 
       int result = this.dataContext.usp_PaymentMethod_Card_Insert(userId, 
           cardPaymentMethodDto.UserAccountReference, 
           cardPaymentMethodDto.EncryptedCardNumber, 
           cardPaymentMethodDto.BinRange, 
           cardPaymentMethodDto.LastFourDigits, 
           cardPaymentMethodDto.ExpiryMonth, 
           cardPaymentMethodDto.ExpiryYear, 
           cardPaymentMethodDto.IssueNumber, 
           cardPaymentMethodDto.IssuingBank, 
           cardPaymentMethodDto.IssuingCountry, 
           cardPaymentMethodDto.Scheme, 
           cardPaymentMethodDto.StartMonth, 
           cardPaymentMethodDto.StartYear, 
           cardPaymentMethodDto.BillingAddress.House, 
           cardPaymentMethodDto.BillingAddress.SubPremises, 
           cardPaymentMethodDto.BillingAddress.Street, 
           cardPaymentMethodDto.BillingAddress.Town, 
           cardPaymentMethodDto.BillingAddress.County, 
           cardPaymentMethodDto.BillingAddress.Postcode, 
           cardPaymentMethodDto.BillingAddress.Country, 
           cardPaymentMethodDto.DateRegistered, 
           ref cardId); 

       if (result <= 0) 
       { 
         CompanySystemSqlException tex = new 
CompanySystemSqlException("Database communications error"); 
         tex.Data.Add("UserId", userId); 
         tex.Data.Add("PaymentMethod", cardPaymentMethodDto.ToString()); 
         Logger.LogException("SaveCard: result <= 0", tex); 
         throw tex; 
       } 
     } 
     catch (DbException ex) 
     { 
       CompanySystemSqlException tex = new 
CompanySystemSqlException("Database communications error", ex); 
       tex.Data.Add("UserId", userId); 
       tex.Data.Add("PaymentMethod", cardPaymentMethodDto.ToString()); 
       Logger.LogException("SaveCard: DbException", tex); 
       throw tex; 
     } 

     return cardId ?? 0; 

} 

un test unitaire j'est:

[Test] 
public void SaveCard_ValidData_ShouldReturnValidCardId() 
{ 
     int cardId; 
     int? refCardId = 0; 
     dataContext.DefaultValue = DefaultValue.Mock; 
     dataContext.Setup(x => 
x.usp_PaymentMethod_Card_Insert(It.IsAny<int>(), It.IsAny<string>(), 
It.IsAny<string>(), It.IsAny<string>(), 
       It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), 
It.IsAny<int>(), It.IsAny<string>(), It.IsAny<string>(), 
       It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), 
It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), 
       It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), 
It.IsAny<string>(), It.IsAny<DateTime>(), ref refCardId)).Returns(1); 

     cardId = paymentRepository.SaveCard(1, new CardPaymentMethodDto 
{ BillingAddress = new AddressDto { Country = "", County = "", House = 
"", Postcode = "", Street = "", SubPremises = "", Town = ""}, 
                             BinRange = "", Cv2 = 123, 
                             DateRegistered = DateTime.Now, EncryptedCardNumber = 
"jumble", 
                             ExpiryMonth = "02", ExpiryYear = "2030", Id = 1, 
IssueNumber = 1, IssuingBank = "", IssuingCountry = "", 
                             LastFourDigits = "", LastUsed = DateTime.MinValue, Scheme 
= "", StartMonth = "", StartYear = "", 
                             UserAccountReference = ""}); 

     Assert.That(cardId, Is.EqualTo(1)); 

} 

Maintenant, évidemment, j'ai dû créer l'arbitre param (refCardId) dans l'unité test, ou je ne peux pas configurer le résultat attendu, mais refCardId <> la variable cardId du référentiel , donc il est évidemment défaillant (résultat de la première méthode revient à zéro).

Je suis sûr qu'il me manque quelque chose, mais quoi ...?

Merci pour toute aide, Cheers, Terry

+2

Jetez un oeil à: http: // stackoverflow. com/questions/1068095/assigning-out-ref-paramètres-en-moq – Grzenio

Répondre

1

A partir de Moq 4.8 (qui est pas encore sorti, mais il y a une pré-version), vous pouvez faire correspondre ref paramètres à l'aide It.Ref<T>.IsAny:

dataContext.Setup(x => x.usp_PaymentMethod_Card_Insert(
          It.IsAny<int>(), 
          It.IsAny<string>(), 
          ... 
          It.IsAny<DateTime>(), 
          ref It.Ref<int?>.IsAny)) 
      .Returns(1); 
0

Je ne suis pas tout à fait sûr si je comprends le problème, mais vous avez attribué 0 à refCardId dans votre test.

int? refCardId = 0; 

Votre maquette ne changera pas cette valeur car elle ne le peut pas. Votre maquette est seulement un proxy qui fait exactement ce que vous dites dans sa méthode d'installation. Dans ce cas, votre Mock retournera 1 quand il est appelé. ça ne fait rien avec le refCardId. Gardez à l'esprit que votre sut est paymentRepository et sa méthode SaveCard - le simulacre est seulement là pour tester le sut sans la dépendance sur le dataContext.