模拟 Azure 函数 HttpTrigger 和设置查询字符串

Mock Azure Function HttpTrigger and Setup Query String

我正在研究具有 HttpTrigger 的 xUnit for.NET 核心 Azure 函数。我已经设法模拟 HttpTrigger,它希望在正文中接收数据,但在查询字符串中苦苦挣扎。我在测试之外制作了通用函数 class 以便其他 Azure Functions 测试可以使用它。

我需要帮助来为接受查询字符串的 HttpRequest 创建模拟。我相信需要模拟 IQueryCollection

的安装类型

Azure 函数

[FunctionName("MyFunction")]
public async Task<IActionResult> Run(
  [HttpTrigger(AuthorizationLevel.Function, "post", Route = "DELETE")] HttpRequest req,
  [ServiceBus("MyServiceBus", Connection = "MyServiceBusConn")] IAsyncCollector<Message> servicebusMessage)
{
    string sessionId = string.Empty;
    var DateTimeNow = DateTime.Now;
    sessionId = req.Query["sessions"]; //Mock to return this??
}

为 HttpRequest 主体创建模拟的方法

public Mock<HttpRequest> CreateMockRequest(object body)
{
    var memoryStream = new MemoryStream();
    var writer = new StreamWriter(memoryStream);

    var json = JsonConvert.SerializeObject(body);

    writer.Write(json);
    writer.Flush();

    memoryStream.Position = 0;

    var mockRequest = new Mock<HttpRequest>();

    mockRequest.Setup(x => x.Body).Returns(memoryStream);
    mockRequest.Setup(x => x.ContentType).Returns("application/json");

    return mockRequest;
}

需要以下方法的帮助

为 HttpRequest 查询字符串创建模拟的方法

public Mock<HttpRequest> CreateQueryMockRequest(object body)
{
    var memoryStream = new MemoryStream();
    var writer = new StreamWriter(memoryStream);

    var json = JsonConvert.SerializeObject(body);

    var mockRequest = new Mock<HttpRequest>();
    mockRequest.Setup(x => x.Query).Returns(json); // This doesn't work??
    mockRequest.Setup(x => x.ContentType).Returns("application/json");

    return mockRequest;
}

测试Class

[Fact]
public void Function_ShouldReturn_XYZ()
{
    //Arrange
    var providerSessionId = RingGoExemptionTestData.GetProviderSession(); //GetProviderSession() implementation below

    Mock<HttpRequest> mockHttpRequest = httpResquestFactory.CreateQueryMockRequest(providerSessionId); // this is where I am trying to use method define above
}

查询字符串的 Dto 对象

public static RingGoSession GetProviderSession()
{
    var ringGoSession = new RingGoSession
    {
        RingGoRef = "232d3f"
    };

    return ringGoSession;
}

您可以创建 QueryCollection 的新实例(阅读 this)并设置模拟。

var mockDict = new Dictionary<string, StringValues>
{
        { "key1", "some value" },
        { "sessions", "random session string"}
};

mockRequest.Setup(x => x.Query).Returns(new QueryCollection(mockDict));

得到答案;

'处理查询字符串的通用方法`

 public Mock<HttpRequest> CreateMockHttpRequest(Dictionary<string, StringValues> query)
 {
        var context = new DefaultHttpContext();

        var request = context.Request;

        request.Query = new QueryCollection(query);

        var mockRequest = new Mock<HttpRequest>();

        mockRequest.Setup(x => x.Query).Returns(request.Query);

        return mockRequest;
    }

This is how to create Mock by passing Query

  var query = new Dictionary<string, StringValues>();
  query.TryAdd("myKey", MyKeyValue);

  Mock<HttpRequest> mockHttpRequest = httpResquestFactory.CreateMockHttpRequest(query);