Вы пытаетесь проверить функциональность сторонних зависимостей. Поскольку в этих зависимостях есть абстракции, которые можно смоделировать, им требуется неоправданное количество настроек, чтобы изолировать их для модульного тестирования, что для меня является запахом кода.
Я предлагаю абстрагировать эту стороннюю зависимость
private readonly ISearchService service;
//...assuming service injected
public SearchIndexWriter(ISearchService service) {
this.service = service;
}
public Task Write(ISearchIndexClient indexClient, Search search) {
return service.UploadContents(indexClient, search.SearchContents);
}
Старайтесь избегать тесной связи со статическими проблемами, поскольку это затрудняет модульное тестирование в изоляции.
Определение сервиса может выглядеть как
public interface ISearchService {
Task UploadContents(ISearchIndexClient indexClient, IReadOnlyCollection<dynamic> searchContents);
}
с простой реализацией, котораяоборачивает внешнюю зависимость
public class SearchService : ISearchService {
private Task UploadContents(ISearchIndexClient indexClient, IReadOnlyCollection<dynamic> searchContents)
=> indexClient.Documents.IndexAsync(IndexBatch.Upload(searchContents));
}
Хватит напрягаться при попытке протестировать код, который вы не можете контролировать. Вместо этого сосредоточьтесь на своей логике, которой вы можете управлять.
public async Task Write_Success() {
//Arrange
var serviceMock = new Mock<ISearchService>();
serviceMock
.Setup(_ => _.UploadContents(It.IsAny<ISearchIndexClient>(), It.IsAny<IReadOnlyCollection<It.AnyType>>())
.ReturnsAsync(new object());
var searchIndexClientMock = Mock.Of<ISearchIndexClient>();
var pushFunction = new SearchIndexWriter(serviceMock.Object);
Search search = new Search();
//Act
await pushFunction.Write(searchIndexClientMock.Object, search);
//Assert, Verify checks
//...
}