Mock Stub и Moq Setup действуют по-разному?Что является эквивалентом заглушки в Moq? - PullRequest
0 голосов
/ 13 декабря 2018

При написании модульного тестирования в двух разных проектах я понял, что поведение установки в Moq отличается от поведения заглушки в Rhino-Mocks.

Один класс использует Mock, у которого есть один из этих сценариев, где я заглушаю

for (int i=0; i<ObjectAList.Count; i++)
{
     _translator.Stub(x => x.TranslateToObjectB(ObjectAList[i])).Return(ObjectBList[i]);
}

, приведенный выше пример работает как чудо.

Но когда я пытался сделать то же самоевещь в другом проекте, который использует Moq, используя настройки, это не удалось.

for (int i=0; i<ObjectAList.Count; i++)
{
     _translator.SetUp(x => x.TranslateToObjectB(ObjectAList[i])).Returns(ObjectBList[i]);
}

Вместо этого мне пришлось сделать что-то вроде этого:

int i = 0;
foreach (var ObjectA in ObjectAList)
{
     _translator.Setup(x => x.ConvertToProcessingFilter(ObjectA)).Returns(ObjectBList[i]);
     i++;
}

Я просто ищу причину, по которой stub vs setup ведет себя так по-разному.Если это ожидаемое от установки, то что эквивалентно заглушке в Moq?

1 Ответ

0 голосов
/ 18 декабря 2018

То, что вы видите, относится к Замыканиям, которые ведут себя по-разному в for и foreach петлях .

С:

for (int i=0; i<ObjectAList.Count; i++)
{
     _translator.Setup(x => x.TranslateToObjectB(ObjectAList[i])).Returns(ObjectBList[i]);
}

вы закрытие (захват) переменная for.Поведение будет зависеть от , когда среда пересмотра оценивает лямбда-выражение.

Попробуйте:

for (int i=0; i<ObjectAList.Count; i++)
{
     var j = i;
     _translator.Setup(x => x.TranslateToObjectB(ObjectAList[j])).Returns(ObjectBList[j]);
}

.Будет ли это работать?

Вы также можете выполнить только одну настройку, подобную этой:

_translator.Setup(x => x.TranslateToObjectB(It.IsAny<ObjAType>()))
  .Returns((ObjAType a) => ObjectBList[ObjectAList.IndexOf(a)]);
...