Я бы хотел протестировать метод, вызываемый несколько раз во время теста, таким образом, чтобы вывод тестируемого метода зависел от его ввода. Я проверил документацию Moq, и мне показалось, что мне нужен следующий пример:
// matching Func<int>, lazy evaluated
mock.Setup(foo => foo.Add(It.Is<int>(i => i % 2 == 0))).Returns(true);
Протестированный метод выглядит следующим образом:
Task<DimensionStructure> GetDimensionStructureByIdAsync(DimensionStructure dimensionStructure);
Класс DimensionStructure выглядит следующим образом, он упрощен как на Id
это важно.
public class DimensionStructure
{
public long Id { get; set; }
}
Но когда я собираю макет, который мне нужен, пример ниже, когда он вызывается, он всегда возвращает null
.
_masterDataWebApiClientMock.Setup(m => m.GetDimensionStructureByIdAsync(
It.Is<DimensionStructure>(
structure => structure.Id == 101)
))
.ReturnsAsync(addedToRoot);
_masterDataWebApiClientMock.Setup(m => m.GetDimensionStructureByIdAsync(
It.Is<DimensionStructure>(
structure => structure.Id == 201 )
))
.ReturnsAsync(addedToFirstLevel);
Дело в том, что метод получает другой параметр и возвращает разные объекты. В обоих случаях возвращается null
. Согласно do c, он должен возвращать то, что находится в ReturnAsync
, которое не является нулевым.
Он отлично работает в другом тесте, где значение свойства Id
объекта не имеет значения.
_masterDataWebApiClientMock.Setup(m => m.GetDimensionStructureByIdAsync(It.IsAny<DimensionStructure>()))
.ReturnsAsync(addedDimensionStructure);
Вопрос, как решить эту проблему?
Обновление - 02/29/2020
Когда я не указываю звонок Параметр тогда просто работает нормально. Тестирование метода немного сложнее, но решаемо.
_masterDataWebApiClientMock
.Setup(m => m.GetDimensionStructureByIdAsync(
It.IsAny<DimensionStructure>()
))
.ReturnsAsync(addedToRoot);
С другой стороны, я сообщил , что это особый возможный случай ошибки для людей Moq.