Ho un servizio API che chiama un altro servizio API. Quando ho creato gli oggetti Mock, non è riuscito con un errore:Espressione fa riferimento a un metodo che non appartiene all'oggetto mocked
NotSupportedException: expression references a method that does not belong to the mocked object.
Questo è il codice:
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() });
}
ho letto Expression testing with Moq, ma non ha funzionato per il mio caso. Se rimuovo questo _mockCarrierService.Setup()
, il test case può essere eseguito ma fallisce con un NullReferenceException
perché non aveva una configurazione valida List<IQueryable<AccountSearchModel>>
.
Qualche idea su come posso raggiungere questo obiettivo?
Nota: soluzione attuale
FWIW, ecco la soluzione che ho attualmente in uso. Sono pronto per un approccio migliore al problema (fino a quando Moq inizia a supportare i metodi di estensione fittizia).
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: quadro di scherno alternativa
Ho anche trovato un quadro di scherno commerciale che supporta beffardo metodo di estensione e collegamento per l'how-to docs: Telerik JustMock.
Grazie per l'aiuto. Ho trovato un altro articolo dello stesso autore di quello che hai menzionato qui. Potrebbe funzionare se aggiungo un metodo più complicato [Fact] ad esso. Devo cercare di sapere per certo. –
@IsabelHM, ho aggiornato la risposta, quindi potresti pensare al problema da una prospettiva diversa :) –
Grazie per le informazioni. –