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

问题描述

我正在尝试对使用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>>));

问题出在参数.Returns(Task.Fromresult(<<PROBLEM HERE>>))部分。它期望从.SearchAsync()方法返回的具体对象。根据docs和autocomplete的介绍,该方法返回Azure.Response,这是一个抽象类。因此,我无法更新它。实际上,该方法返回一个后代类Azure.ValueResponse,该类不是抽象的,但在Azure SDK的内部,因此也无法进行更新。

那么如何模拟SearchClient.SearchAsync?

P.S。使用Azure.Search.Documents,v11.1.1.0

解决方法

有关信息,请参见https://github.com/Azure/azure-sdk-for-net/blob/master/sdk/core/Azure.Core/README.md#mocking。基本上,您可以将Response.FromValueSearchModelFactory一起使用(我们的所有Azure。*客户端SDK遵循的模式,这些模型无法使用构造函数和/或可设置属性完全模拟)创建一个类似的模拟游戏(使用Moq,因为我不熟悉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,},100,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);

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...