2010-09-03 2 views
2

Я крест отправил это на обсуждение группы #moq по адресу: http://groups.google.com/group/moqdisc/browse_thread/thread/569b75fd2cc1829dMocking параметры реф

эй люди,

я наткнулся на проблему с издевались реф парам, что я уверен, что должен быть очевиден, но, будучи новичком в каркасе, я просто не могу это сделать .

У меня есть следующий метод: хранилище

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; 

} 

испытание на блок у меня есть:

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

} 

Теперь, очевидно, я должен был создать реф параметров (refCardId) в блоке , или я не могу настроить ожидаемый результат, но refCardId <> Репозиторий cardId переменная, поэтому она явно не работает (результат от первого метода возвращается как ноль).

Уверен, что мне что-то не хватает, но что ...?

Спасибо за любую помощь, Приветствия, Терри

+2

Посмотрите по адресу: // StackOverflow. ком/вопросы/1068095/назначая-из-реф-параметры-в-MOQ – Grzenio

ответ

1

Начиная с Moq 4.8 (который еще не выпущен, но есть предварительная версия), вы можете сопоставить ref параметры с помощью 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

Я не совсем уверен, если я понял проблему, но вы назначили 0 до refCardId в тесте.

int? refCardId = 0; 

Ваш макет не изменит это значение, потому что он не может. Ваш макет - это только прокси-сервер, который точно выполняет то, что вы говорите в его методе установки. В этом случае ваш Mock вернет 1, когда он будет вызван. он ничего не делает с refCardId.

Имейте в виду, что ваш сут - платежный репозиторий и его метод SaveCard - макет только там, чтобы проверить сут без зависимости от dataContext.