代码之家  ›  专栏  ›  技术社区  ›  Terry_Brown

模拟参考参数

  •  2
  • Terry_Brown  · 技术社区  · 15 年前

    http://groups.google.com/group/moqdisc/browse_thread/thread/569b75fd2cc1829d

    嘿,伙计们,

    我遇到了一个问题,我敢肯定,与嘲弄参考参数 必须是显而易见的,但作为一个新的框架,我只是不能工作

    我有以下存储库方法:

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

    测试,或者我无法设置预期结果,但refcard<> repository cardId变量,因此它显然失败了(由 第一种方法返回为零)。

    谢谢你的帮助, 干杯, 特里

    2 回复  |  直到 15 年前
        1
  •  1
  •   stakx - no longer contributing Saravana Kumar    8 年前

    从moq4.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);
    
        2
  •  0
  •   mrt181    14 年前

    我不太确定我是否理解这个问题,但您在测试中已将0分配给refcardd。

    int? refCardId = 0;
    

    你的mock不会改变这个值,因为它不能。你的mock只是一个代理,它完全按照你在安装方法中告诉它的做。在这种情况下,调用Mock时将返回1。它与refcard没有任何关系。

    请记住,sut是paymentRepository及其SaveCard方法—mock只用于测试sut,而不依赖于dataContext。

    推荐文章