Как смоделировать DocumentClient CreateDocumentQuery с фильтрами для модульного тестирования DocumentDb?
Я пишу модульные тесты для приведенного ниже фрагмента кода, который использует метод CreateDocumentQuery клиента Document с условиями where(filter).
var documentQuery = ReadOnlyDocumentClient.CreateDocumentQuery<MyView>(UriFactory.CreateDocumentCollectionUri(Constants.COSMOS_DB_NAME, Constants.MY_VIEW_COL_NAME))
.Where(w => w.Name== query.Name)
.Where(w => w.DOB> query.StartDate && w.DOB < query.EndDate)
.AsDocumentQuery();
запрос является параметром команды, который является входом.
Я использую MOQ, чтобы издеваться, и я использую ниже строки кода, чтобы издеваться
mockDocumentClient.Setup(s => s.CreateDocumentQuery<MyView>(It.IsAny<Uri>(), It.IsAny<FeedOptions>())).Returns(mockDocumentQuery.Object);
Теперь вышеупомянутый фрагмент кода только макетирует CreateDocumentQuery, и когда условия Где выполняются, я не получаю фиктивную поддержку.
Пожалуйста, предложите, как я могу издеваться над CreateDocumentQuery с условиями?
Заранее спасибо.
0 ответов
Когда вы издеваетесь над CreateDocumentQuery
, вам также нужно издеваться над IQueryProvider
который взаимодействует с IEnumerable
что вы ожидаете в результате запроса.
Вот пример:
// somewhere in your test class
public interface IFakeDocumentQuery<T> : IDocumentQuery<T>, IOrderedQueryable<T>
{
}
// somewhere in your test method
var expected = new List<YourType>
{
new YourType
{
yourField = "yourValue"
}
};
var mockDocumentClient = new Mock<IDocumentClient>();
var dataSource = expected.AsQueryable();
var response = new FeedResponse<YourType>(dataSource);
var mockDocumentQuery = new Mock<IFakeDocumentQuery<YourType>>();
// the part that gets the work done :)
var provider = new Mock<IQueryProvider>();
provider
.Setup(p => p.CreateQuery<YourType>(It.IsAny<Expression>()))
.Returns(mockDocumentQuery.Object);
mockDocumentQuery
.Setup(q => q.ExecuteNextAsync<YourType>(It.IsAny<CancellationToken>()))
.ReturnsAsync(response);
mockDocumentQuery
.SetupSequence(q => q.HasMoreResults)
.Returns(true)
.Returns(false);
mockDocumentQuery
.As<IQueryable<YourType>>()
.Setup(x => x.Provider)
.Returns(provider.Object);
mockDocumentQuery
.As<IQueryable<YourType>>()
.Setup(x => x.Expression)
.Returns(dataSource.Expression);
mockDocumentQuery
.As<IQueryable<YourType>>()
.Setup(x => x.ElementType)
.Returns(dataSource.ElementType);
mockDocumentQuery
.As<IQueryable<YourType>>()
.Setup(x => x.GetEnumerator())
.Returns(dataSource.GetEnumerator);
mockDocumentClient
.Setup(c => c.CreateDocumentQuery<YourType>(It.IsAny<Uri>(), It.IsAny<FeedOptions>()))
.Returns(mockDocumentQuery.Object);
Надеюсь, это поможет!:)
Вы можете попробовать следующий пример:
var documentClientMock = new Mock<IDocumentClient>();
var docs = new List<MyView>();//your mock data
documentClientMock.Setup(d => d.CreateDocumentQuery<MyView>(It.IsAny<Uri>(), It.IsAny<FeedOptions>()))
.Returns((IOrderedQueryable<MyView>) docs.AsQueryable());