У меня есть служба api, которая вызывает другую службу api. Когда я настраивал объекты Mock, сбой произошел с ошибкой:
NotSupportedException: выражение ссылается на метод, который не принадлежит к издеваемому объекту.
Это код:
private Mock<IEnumerable<ICarrierApiService<AccountSearchModel>>> _mockCarrierService;
private Mock<IApiService<AccountSearchModel>> _mockApiService;
[SetUp]
public void SetUp()
{
_mockApiService = new Mock<IApiService<AccountSearchModel>>();
_mockCarrierService = new Mock<IEnumerable<ICarrierApiService<AccountSearchModel>>>();
_mockApiService.Setup(x => x.GetFromApiWithQuery(It.IsAny<string>())).Returns(ApiValue());
// Error occurred when call _mockApiService.GetFromApiWithQuery() in .Select()
_mockCarrierService.Setup(x => x
.Select(s => s
.GetFromApiWithQuery(It.IsAny<string>())).ToList())
.Returns(new List<IQueryable<AccountSearchModel>> { ApiValue() });
}
Я читал Экспрессирование с помощью Moq, но это не помогло мне. Если я удалю этот _mockCarrierService.Setup()
, тестовый сценарий может работать, но с ошибкой NullReferenceException
, потому что у него не было установленного значения List<IQueryable<AccountSearchModel>>
.
Любая идея, как я могу это достичь?
Сноска: текущее решение
FWIW, вот решение, которое я сейчас использую. Я все уши для лучшего подхода к проблеме (пока Moq не начнет поддерживать насмешливые методы расширения).
private List<ICarrierApiService<AccountSearchModel>> _mockCarrierService;
private AccountSearchController _mockController;
private Mock<ICarrierApiService<AccountSearchModel>> _mockApiService;
[SetUp]
public void SetUp()
{
_mockApiService = new Mock<ICarrierApiService<AccountSearchModel>>();
_carrierServiceMocks = new List<ICarrierApiService<AccountSearchModel>> { _mockApiService.Object };
_mockApiService.Setup(x => x.GetFromApiWithQuery(It.IsAny<string>())).Returns(ApiValue());
_mockController = new AccountSearchController(_carrierServiceMocks);
}
Сноска: альтернативная издевательская структура
Я также нашел коммерческую насмешливую структуру, которая поддерживает насмешливый метод расширения и ссылку на практические документы: Telerik JustMock.