You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core Azure Function单元测试如何Mock HttpRequest查询字符串

支持查询字符串的HttpRequest Mock实现方案

你原来的代码无法生效是因为HttpRequest.Query属性的返回类型是IQueryCollection,不能直接赋值JSON字符串,需要先构造符合接口规范的实例再配置Mock。

前置依赖

测试项目需要提前安装以下Nuget包:

  • Moq
  • Microsoft.AspNetCore.Http.Abstractions

通用Mock方法实现

可以直接复用原有Body Mock逻辑,新增查询参数可选入参,适配所有场景:

using Microsoft.AspNetCore.Http;
using Moq;
using Newtonsoft.Json;
using System.IO;
using System.Collections.Generic;
using Microsoft.Extensions.Primitives;

public Mock<HttpRequest> CreateMockRequest(object body = null, Dictionary<string, string> queryParams = null)
{
    var mockRequest = new Mock<HttpRequest>();

    // 配置请求Body
    if (body != null)
    {
        var memoryStream = new MemoryStream();
        using var writer = new StreamWriter(memoryStream, leaveOpen: true);
        var json = JsonConvert.SerializeObject(body);
        writer.Write(json);
        writer.Flush();
        memoryStream.Position = 0;
        
        mockRequest.Setup(x => x.Body).Returns(memoryStream);
        mockRequest.Setup(x => x.ContentType).Returns("application/json");
    }

    // 配置查询字符串
    if (queryParams != null)
    {
        var queryDict = new Dictionary<string, StringValues>();
        foreach (var param in queryParams)
        {
            queryDict.Add(param.Key, new StringValues(param.Value));
        }
        var queryCollection = new QueryCollection(queryDict);
        mockRequest.Setup(x => x.Query).Returns(queryCollection);
    }

    return mockRequest;
}

测试调用示例

[Fact]
public void Function_ShouldReturn_XYZ()
{
    //Arrange
    var providerSession = RingGoExemptionTestData.GetProviderSession();
    // 构造查询参数,key对应你业务代码里取的sessions字段
    var queryParams = new Dictionary<string, string>
    {
        { "sessions", providerSession.RingGoRef }
    };
    // 调用Mock方法,同时配置Body和查询参数
    Mock<HttpRequest> mockHttpRequest = httpResquestFactory.CreateMockRequest(body: providerSession, queryParams: queryParams);

    // 后续Act、Assert逻辑
    // ...
}

如果只需要Mock查询字符串不需要Body,调用时将body参数传null即可。


内容的提问来源于stack exchange,提问作者K.Z

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 08:24:07