Expressão referencia um método que não pertence ao objeto simulado
Eu tenho um serviço API que chama outro serviço API. Quando configurei os objetos Mock, ele falhou com um erro:
NotSupportedException: expression referencia um método que não pertence ao objeto simulado.
Este é o código:
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() });
}
Eu liTeste de expressão com Moq mas não funcionou para o meu caso. Se eu remover isso_mockCarrierService.Setup()
, o caso de teste pode ser executado, mas falha com umNullReferenceException
porque não tinha um válidoList<IQueryable<AccountSearchModel>>
configuração.
Alguma idéia de como eu posso conseguir isso?
Nota de rodapé: Solução atual
FWIW, aqui está a solução que eu uso atualmente.Sou todo ouvidos para uma melhor abordagem do problema (até que o Moq comece a oferecer suporte a métodos de extensão de simulação).
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);
}
Nota de rodapé: estrutura de zombaria alternativa
Também encontrei uma estrutura de simulação comercial que suporta o método de extensão de simulação e o link para os documentos de instruções:Telerik JustMock.