2010-09-03 72 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。