升级至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
相关产品推荐
相关产品推荐

