Параметры насмешливой ссылки - PullRequest
2 голосов
/ 03 сентября 2010

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

Эй, ребята,

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

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

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;

}

a модульный тест, который у меня есть:

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

}

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

Я уверен, что что-то упустил, но что ...?

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

Ответы [ 2 ]

1 голос
/ 09 декабря 2017

Начиная с 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 голосов
/ 17 ноября 2011

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

int? refCardId = 0;

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

Имейте в виду, что ваш sut - это paymentRepository и его метод SaveCard - макет только для тестирования sut без зависимости от dataContext.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...