如何使用 Azure 认知搜索 SDK 模拟 SearchClient.SearchAsync?

Ang*_*ker 1 .net mocking automoq azure-cognitive-search .net-core

我正在尝试对使用SearchClient.SearchAsync()方法的代码进行单元测试。我正在使用 AutoFixture.AutoMoq nuget 包。

这是我尝试过的:

mockSearchClient.Setup(msc => msc.SearchAsync<MyModel>(
        It.IsAny<string>(),
        It.IsAny<SearchOptions>(),
        It.IsAny<CancellationToken>()
    )).Returns(Task.FromResult(<<PROBLEM HERE>>));
Run Code Online (Sandbox Code Playgroud)

问题出在参数.Returns(Task.FromResult(<<PROBLEM HERE>>))部分。它需要一个从.SearchAsync()方法返回的具体对象。根据文档和自动完成,该方法返回Azure.Response一个抽象类。所以,我不能更新它。实际上,该方法返回一个后代类Azure.ValueResponse,它不是抽象的,而是 Azure SDK 内部的,因此也无法更新。

那么如何模拟 SearchClient.SearchAsync 呢?

PS 使用 Azure.Search.Documents,v11.1.1.0

Hea*_*ath 5

有关信息,请参阅https://github.com/Azure/azure-sdk-for-net/blob/master/sdk/core/Azure.Core/README.md#mocking。基本上,你可以使用Response.FromValue与沿SearchModelFactory(我们遵循了所有的模式我们Azure上。*适用机型的客户端软件开发工具包,不能用一个构造函数和/或可设置的属性完全嘲笑),以创建像这样(起订量使用一个模拟的,因为我不熟悉 AutoMoq,但应该是类似的):

var responseMock = new Mock<Response>();

var clientMock = new Mock<SearchClient>(() => new SearchClient(new Uri("https://localhost"), "index", new AzureKeyCredential("key")));
clientMock.SetupGet(x => x.IndexName).Returns("index");
clientMock.Setup(x => x.SearchAsync<Hotel>(
        It.IsAny<string>(),
        It.IsAny<SearchOptions>(),
        It.IsAny<CancellationToken>()
    ))
    .Returns(
        Task.FromResult(
            Response.FromValue(
                SearchModelFactory.SearchResults(new[]
                    {
                        SearchModelFactory.SearchResult(new Hotel("1", "One"), 0.9, null),
                        SearchModelFactory.SearchResult(new Hotel("2", "Two"), 0.8, null),
                    },
                    100,
                    null,
                    null,
                    responseMock.Object),
                responseMock.Object)));

var results = await clientMock.Object.SearchAsync<Hotel>("test").ConfigureAwait(false);
var hotels = results.Value;

Assert.Equal(2, hotels.GetResults().Count());
Assert.Equal(100, hotels.TotalCount);
Run Code Online (Sandbox Code Playgroud)