2016-10-21 9 views
0

Я новичок в Unit Testing и Moq, поэтому, если я полностью ошибаюсь в своем методе или понимании, пожалуйста, помогите мне.Moq setup вызывает null

У меня есть логический метод, который я тестирую. Я прокомментировал логику, но все, что она делает, это проверить несколько значений в «модели» и вернуться, если есть проблема. В случае, когда мы смотрим, проблем нет.

 public ReplyDto SaveSettings(SnowballDto model) 
     { 

      // Some logic here that reads from the model. 

      var result = _data.SaveSettings(model); 
      return result; 
     } 

Мой тест, используя NUnit и MOQ, выглядит следующим образом:

_logic = new SnowballLogic(mockSnowballData.Object, mockLog.Object); 

      mockSnowballData 
       .Setup(x => x.SaveSettings(SnowballDto_Good)) 
       .Returns(new ReplyDto { 
        IsSuccess = true, 
        Message = "Saved", 
        ReplyKeyID = 1 
       }); 

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

private void SetupData() 
     { 
      SnowballDto_Good = new SnowballDto { 
       FirstPaymentDate = DateTime.UtcNow, 
       ID = 1, 
       OrderedIDPriority = new List<int>(), 
       SnowballTypeID = 1, 
       TargetPayment = 1000 
      }; 

      DebtDtoList_ThreeDebt.Clear(); 
      DebtDtoList_ThreeDebt.Add(new DebtDto { ID = 1, Description = "Debt 1", ManualSnowballPriority = 1, MinimumMonthlyPaymentAmount = 140, OpeningBalance = 5000, RunningData = new DebtRunningDto { Balance = 5000 }, OpeningDate = DateTime.UtcNow, SnowballID = 1, StandardRate = 10 }); 
      DebtDtoList_ThreeDebt.Add(new DebtDto { ID = 2, Description = "Debt 2", ManualSnowballPriority = 2, MinimumMonthlyPaymentAmount = 90, OpeningBalance = 1600, RunningData = new DebtRunningDto { Balance = 1600 }, OpeningDate = DateTime.UtcNow, SnowballID = 1, StandardRate = 15 }); 
      DebtDtoList_ThreeDebt.Add(new DebtDto { ID = 3, Description = "Debt 3", ManualSnowballPriority = 3, MinimumMonthlyPaymentAmount = 300, OpeningBalance = 9000, RunningData = new DebtRunningDto { Balance = 9000 }, OpeningDate = DateTime.UtcNow, SnowballID = 1, StandardRate = 20 }); 


     } 

Итак, мое понимание MOQ является то, что я говорю «, когда класс SnowballData в„SaveSettings“methid называется, и„объект SnowballDto_Good“передается в, всегда возвращает новый ReplyDto с IsSuccess = True.

Поэтому, когда я делаю вызов:

var result = _data.SaveSettings(model); 

Она должна возвращать ReplyDto с IsSuccess = истинной

Однако, когда я ставлю точку останова когда я вызываю «SaveSettings», он все время возвращает null.

Если изменить мои настройки для:

.Setup(x => x.SaveSettings(It.IsAny<SnowballDto>())) 

тест проходит. Почему он возвращает null, когда я даю ему настоящий SnowballDto?

+2

Он сравнивает аргумент по ссылке –

+1

Вы передаете тот же объект, который используется в настройке? – Nkosi

+0

Да, я прохожу один и тот же объект. – Craig

ответ

0

ну, это, кажется, вы передаете экземпляр SnowballDto имени model в «акте» части теста

var result = _data.SaveSettings(model);

В настройке MOQ, однако, настроить его вернуть новый ReplyDto, только если экземпляр SnowballDto_Good указан в SaveSettings. Во всех других случаях макет метода не настроен, и - в случае свободной стратегии насмешек (по умолчанию) - он вернет значение по умолчанию для типа возвращаемого значения SaveSettings. В этом случае: null.

Когда вы используете It.IsAny<SnowballDto> вы в основном говорить MOQ настроить SaveSettings вернуть новый экземпляр не только то экземпляр SnowballDto_Good передается к нему, но любой экземпляр этого типа.

Что вам нужно сделать, это изменить свой «акт» часть теста следующим образом:

var result = _data.SaveSettings(SnowballDto_Good);

, то он будет работать с исходным макетом установки, так как правильный экземпляр будет передан SaveSettings.

Именно поэтому я хотел бы создать экземпляр своих мошенников с помощью MockBehavior.Strict.

Вместо того, чтобы возвращать null, он выдаст исключение, которое сообщит вам, что вы неправильно настроили свой макет.

Надеюсь, это поможет.