Moq — Универсальная настройка не возвращает ожидаемое значение

#c# #unit-testing #moq

#c# #модульное тестирование #moq

Вопрос:

Я новичок в Moq, здесь у меня две настройки.

 var settingsMock = new Mocklt;IECSConfigSettingsgt;(); settingsMock.Setup(m =gt; m.GetRootValue("ss", It.IsAnylt;stringgt;())).Returns("aaa");  

И еще один такой

 private static void BuildSettingCacheForMocklt;Tgt;(Mocklt;IECSConfigSettingsgt; mock, string key, T value)  {  mock.Setup(m =gt; m.GetRootValuelt;Tgt;(key, It.IsAnylt;Tgt;())).Returns(value);  mock.Setup(m =gt; m.GetValuelt;Tgt;(key, It.IsAnylt;Tgt;())).Returns(value);  mock.Setup(m =gt; m.TryGetValuelt;Tgt;(key, out value)).Returns(true);  mock.Setup(m =gt; m.TryGetRootValuelt;Tgt;(key, out value)).Returns(true);  } var settingsMock = new Mocklt;IECSConfigSettingsgt;(); BuildSettingCacheForMocklt;stringgt;(settingsMock, "sss", "aaa1");  

Наконец, когда я призываю их обоих

 var s1 = new SettingsETag(settingsMock.Object, etag: "ETag", null).Settings.GetRootValue("ss"); // gives "aaa" var s2 = new SettingsETag(settingsMock.Object, etag: "ETag", null).Settings.GetRootValue("sss"); // gives null  

Детали интерфейса Код интерфейса

Я не знаю, в чем разница между ними и почему результат для второго равен нулю. Ценю ваши мысли по этому поводу!

Комментарии:

1. Пожалуйста, добавьте (соответствующие части) определения интерфейса в виде текста, а не изображения.

Ответ №1:

Вы настроили возвращаемое значение для конкретного вызова settingsMock.Setup(m =gt; m.GetRootValue("ss", It.IsAnylt;stringgt;())).Returns("aaa"); — то есть при вызове с ключом «ss», никаких других значений. Второй вызов не имеет настроенного возвращаемого значения, поэтому вы получаете возвращаемое значение по умолчанию null .

В общем, я думаю, что это помогает создавать насмешки MockBehavior.Strict . Это дает вам информацию о неожиданных вызовах при выполнении модульных тестов. Конструктор выглядит так;

 var settingsMock = new Mocklt;IECSConfigSettingsgt;(MockBehavior.Strict);  

Если вы хотите вернуть одно и то же значение независимо от значения параметра, вы также можете использовать It.IsAnylt;stringgt;() первый параметр.

 settingsMock.Setup(m =gt; m.GetRootValue(It.IsAnylt;stringgt;(), It.IsAnylt;stringgt;())).Returns("aaa");  

Комментарии:

1. Спасибо за объяснение. Я думаю, что я действительно намерен настроить возвращаемое значение в функции BuildSettingCacheForMock, и я вызвал ее перед вызовом фактического вызова. Но не уверен, почему программа рассматривает это как отсутствие настройки.

2. Если вы попробуете Строгое поведение, вы увидите, что не настроили возвращаемое значение для вашего второго вызова. Вам нужно только настроить вызов m.GetRootValue("ss", [any value])

3. да, но я в замешательстве, не должен ли BuildSettingCacheForMocklt;stringgt;(settingsMock, «sss», «aaa1»); уже настроить вызов?

4. Он настраивает вызов только для этого конкретного значения параметра («ss»). Любое другое значение параметра даст вам значение null. Если вы хотите настроить все значения, вам нужно написать It.IsAnylt;stringgt;() вместо «ss» в настройках.

5. Во втором способе настройки макета функция BuildSettingCacheForMock вызывает макет. Настройка(m =gt; m.Значение getRootgt;lt;Tgt;(ключ, Ит. IsAnylt;Tgt;())).Возвращает(значение), поэтому, если я вызову его с помощью («sss», «aaa1»), «sss» также должен быть настроен для этого макета, верно?