Вам нужно издеваться над GetListOfApps
, чтобы он действительно возвращал вам что-то на l oop. Для этого вам нужно использовать метод Returns
.
Предполагая, что метод возвращает List<App>
, ваша настройка может выглядеть следующим образом:
_data.Setup(x => x.GetListOfApps())
.Returns(new List<App> { new App { AppId = "X" } });
Теперь ваш метод будет получить данные на l oop и будет вызван метод, который вы пытаетесь проверить.
Обратите внимание, что пока вы настраиваете GetJsonDataString
, вы не передаете ему возвращаемое значение. По умолчанию Moq вернет null
, но вам, вероятно, следует также имитировать это с возвращаемым значением.
_data.Setup(x => x.GetJsonDataString(It.IsAny<string>()))
.Returns("some string");
Существуют также перегрузки Returns
, которые принимают фабричную функцию и принимают аргументы, переданные в фиктивная функция в качестве входных данных. Вы можете использовать это, если хотите / хотите, чтобы результат возврата отличался в зависимости от входных параметров.
_data.Setup(x => x.GetJsonDataString(It.IsAny<string>()))
.Returns(strParam => "some string" + strParam);
Теперь, когда вы проверяете, я бы не советовал использовать It.IsAny
, когда вы можно . Иначе вы говорите, что вам все равно как это называется. Предположим, мы хотим проверить, что он действительно был вызван с использованием фиктивного значения сверху (AppId="X"
), вы бы сделали это:
_apicall.Verify(x => x.GetJsonDataString("ApiEndPointX"), Times.Once);
Теперь у вас есть тест, который не просто проверяет, действительно ли метод был вызван, но на самом деле проверка была вызвана с ожидаемыми значениями.
Боковое примечание: у вашего тестового класса нет причин принимать параметры в своем конструкторе, особенно типа Mock<>
. Вы их даже не используете! И технически это не должно даже выполняться, поскольку у вас нет настройки IClassFixture
. Вы можете полностью избавиться от конструктора (и назначить поля напрямую) или просто удалить параметры:
public TestA()
{
_data = new Mock<IData>();
_apiCall = new Mock<IApiCall>();
}