.NET Core Azure Function单元测试如何Mock HttpRequest查询字符串
支持查询字符串的HttpRequest Mock实现方案
你原来的代码无法生效是因为HttpRequest.Query属性的返回类型是IQueryCollection,不能直接赋值JSON字符串,需要先构造符合接口规范的实例再配置Mock。
前置依赖
测试项目需要提前安装以下Nuget包:
MoqMicrosoft.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
相关产品推荐
相关产品推荐

