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

升级至V4时HttpRequestData模拟报错:不支持扩展方法设置

解决方案

问题出在你试图用Moq Setup静态扩展方法CreateResponse(HttpStatusCode),但Moq不支持对扩展方法进行Setup/验证——因为扩展方法本质是静态工具方法,不属于HttpRequestData的实例成员。

看你提供的扩展方法实现,它内部是先调用HttpRequestData的无参实例方法CreateResponse(),再设置返回响应的StatusCode。所以我们只需要Mock这个无参的实例方法即可,不需要管扩展方法。

修改GetHttpRequestData方法

把原来针对扩展方法的Setup删掉,换成对无参实例方法的Mock:

var fc = new Mock<FunctionContext>();  
var reqMock = new Mock<HttpRequestData>(fc.Object);

if (body != null)
{
    var stream = new MemoryStream();
    var writer = new StreamWriter(stream);
    writer.Write(JsonConvert.SerializeObject(body));
    writer.Flush();

    stream.Position = 0;
    reqMock.Setup(req => req.Body).Returns(stream);
}

// 1. 创建一个HttpResponseData的Mock实例
var responseMock = new Mock<HttpResponseData>(fc.Object);
// 2. Setup HttpRequestData的无参CreateResponse方法,返回这个mock的响应
reqMock.Setup(req => req.CreateResponse())
       .Returns(responseMock.Object);

// 允许修改StatusCode属性,让函数代码可以正常设置状态码
responseMock.SetupProperty(r => r.StatusCode);

var r = reqMock.Object;
return r; 

验证响应状态码

测试代码可以直接对返回的响应状态码进行断言:

var req = RequestHelper.GetHttpRequestData(body: GetRequestPayload());
HttpResponseData response = await _fnc.RunAsync(req);

Assert.IsNotNull(response);
Assert.AreEqual(HttpStatusCode.NotFound, response.StatusCode);

补充说明

如果函数代码中调用了其他CreateResponse重载的扩展方法,本质都是基于HttpRequestData的实例方法实现的,只需Mock对应的底层实例方法即可。比如带额外参数的扩展方法,最终都会调用无参实例方法生成基础响应对象,再做后续配置。

内容的提问来源于stack exchange,提问作者macm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 06:30:51