2010-09-03 129 views
2

我交會上發佈本就#moq討論組: http://groups.google.com/group/moqdisc/browse_thread/thread/569b75fd2cc1829d嘲諷裁判參數

嘿夥計,

我所遇到的問題帶有嘲諷裁判PARAM,我敢肯定 必須是顯而易見的,但是對於框架來說,我只是不能使用它而不是 。

我有以下方法庫:

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

在看看//計算器。 COM /問題/ 1068095 /分配出-REF參數功能於MOQ – Grzenio 2010-09-03 13:30:08

回答

1

與起訂量4.8開始(這是尚未公佈,但有一個預發佈版本),你可以使用It.Ref<T>.IsAny匹配ref參數:HTTP:

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; 

你的模擬不會改變這個值,因爲它不能。你的模擬只是一個代理,完全按照你在安裝方法中所說的去做。在這種情況下,你的模擬會在被調用時返回1。它不會對refCardId做任何事情。

請記住,您的付款方式是paymentRepository及其SaveCard方法 - 模擬僅用於測試不依賴於dataContext的sut。