如何使用Moq模拟HttpRequestMessage请求消息

3
我正在开发一个Web API,它是一个ASP.NET应用程序。我需要为HttpRequestMessage类的CreateResponse(HttpStatusCode statusCode, T value)方法创建一个模拟对象。但每次执行测试时都会出现异常。"最初的回答"
Test Name:  RHT.Tests.Controllers.AccountControllerTests.Can_login_with_valid_credentials
Test FullName:  RHT.Tests.Controllers.AccountControllerTests.Can_login_with_valid_credentials
Test Source:    Controllers\AccountControllerTests.cs : line 23
Test Outcome:   Failed
Test Duration:  0:00:01.028

Result StackTrace:  
at Moq.Mock.ThrowIfSetupExpressionInvolvesUnsupportedMember(Expression setup, MethodInfo method) in C:\projects\moq4\src\Moq\Mock.cs:line 755
   at Moq.Mock.SetupNonVoidPexProtected(Mock mock, LambdaExpression expression, Condition condition) in C:\projects\moq4\src\Moq\Mock.cs:line 433
   at Moq.PexProtector.Invoke[T1,T2,T3,TResult](Func`4 function, T1 arg1, T2 arg2, T3 arg3) in C:\projects\moq4\src\Moq\PexProtector.cs:line 38
   at Moq.Mock.SetupNonVoid(Mock mock, LambdaExpression expression, Condition condition) in C:\projects\moq4\src\Moq\Mock.cs:line 421
   at Moq.Mock`1.Setup[TResult](Expression`1 expression) in C:\projects\moq4\src\Moq\Mock.Generic.cs:line 317
   at RHT.Tests.Controllers.AccountControllerTests.Can_login_with_valid_credentials() in C:\Users\ttong\source\repos\RedHawkTestPlan\RHT.Tests\Controllers\AccountControllerTests.cs:line 51
Result Message: System.NotSupportedException : Invalid setup on an extension method: m => m.CreateResponse<string>(HttpStatusCode.OK, "value")

The test

        Mock<IAuthProvider> auth = new Mock<IAuthProvider>();
        auth.Setup(m => m.CreateEncryptedCookieValue(
            It.IsAny<bool>(), It.IsAny<string>()))
            .Returns("my_ticket");

        Mock<HttpRequestMessage> req = new Mock<HttpRequestMessage>();
        req.Setup(m => m.CreateResponse(
            HttpStatusCode.OK, "value"))
            .Returns(new HttpResponseMessage(HttpStatusCode.OK));

测试方法有3个模拟对象,但只有HttpRequestMessage无法初始化。为什么会这样?请问您有什么想法?"最初的回答"。
1个回答

1
答案在错误信息中:
System.NotSupportedException: 在扩展方法上进行的设置无效
CreateResponse不是HttpRequestMessage类的方法,而是扩展方法。 扩展方法不能被模拟,因为它们实际上是静态方法。

这解释了为什么它失败了。谢谢gnud回答我的问题。那么,有没有办法创建并返回一个HttpResponseMessage呢? - undefined
你可以使用一个真实的(而不是模拟的)HttpRequestMessage。请参考https://dev59.com/fWgv5IYBdhLWcg3wD8uY。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接