模拟 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);
我正在研究具有 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);