XUnit, Moq. Мок не возвращает данные
Вроде разобрался с тестированием в мире .NET. Только застрял на одном тесте, никак не пойму, почему мок не возвращает необходимый набор данных
Сам тест с моком
[Fact]
public async Task GetAllRequestWithSuccess()
{
// Arrange
var testUsers = GetTestModelsUser(); // список необходимого типа данных, модели
var testCount = testUsers.Count(); // количество вхождений
var mockService = new Mock<IUserService>();
var mockLogger = new Mock<ILogger<UserController>>();
mockService.Setup(service => service.ListUsers(It.IsAny<string>(), It.IsAny<int>(), It.IsAny<int>(), It.IsAny<string>(), It.IsAny<bool>()))
.ReturnsAsync((testUsers, testCount));
var controller = new UserController(mockLogger.Object, mockService.Object);
// Act
var actionResult = await controller.All();
var objectReuslt = actionResult as OkObjectResult;
}
Assert-блок пока не добавил.
Никаких ошибок при сборке и запуске нет, но actionResult имеет объект BadRequestResult. Пробежался дебагом и определил, что мок не возвращает необходимый набор данных. То есть переменные testUsers и testCount содержат данные, а вот мок при вызове ListUsers() возвращает (null, 0).
Как сделать мок рабочим?
UPD
Следуя советам с enSO попробовал собирать и передавать данные отдельно, что так же не принесло результат
[Fact]
public async Task GetAllRequestWithSuccess()
{
// Arrange
List<UserViewModel> testUsers = GetTestModelsUser();
int testCount = testUsers.Count();
(List<UserViewModel> users, int totalCount) t = (testUsers, testCount);
var mockService = new Mock<IUserService>();
var mockLogger = new Mock<ILogger<UserController>>();
mockService.Setup(service => service.ListUsers(It.IsAny<string>(), It.IsAny<int>(), It.IsAny<int>(), It.IsAny<string>(), It.IsAny<bool>()))
.ReturnsAsync(t);
var controller = new UserController(mockLogger.Object, mockService.Object);
Ответы (1 шт):
Автор решения: Dmitry
→ Ссылка
Две вещи, которые в данном случае необходимо проверить и изменить
- Согласовать входные параметры с интерфейсом функции, которая вызывается в моке, то есть если функция выглядит вот так
то вызвать в мок надо так (смотрите за входными параметрами)public Task<AnyModel, int> AnyFunc(string s, int? i = null)mockService.Setup(service => service.AnyFunc(It.IsAny<string>(), It.IsAny<int?>()).ReturnsAsync(tupleToReturn) - И второе, помогло изменение поведения мока на
StrictmockService = new Mock<IMyInterface>(MockBehavior.Strict);