【问题标题】:How to mock HttpRequestMessage with Moq如何使用 Moq 模拟 HttpRequestMessage
【发布时间】:2019-06-16 09:56:42
【问题描述】:

我正在开发一个网络 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")

测试

        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 初始化失败。知道为什么它不起作用吗?

【问题讨论】:

    标签: c# asp.net moq


    【解决方案1】:

    答案在错误信息中:

    System.NotSupportedException:扩展方法上的设置无效

    CreateResponse 不是HttpRequestMessage 类的方法,而是扩展方法。扩展方法不能被模拟,因为它们实际上是幕后的静态方法。

    【讨论】:

    • 这解释了它失败的原因。谢谢 gnud 回答我的问题。那么,有没有什么方法可以创建并返回一个 HttpResponseMessage 呢?
    • 您可以使用真实的(不是模拟的)HttpRequestMessage。见stackoverflow.com/questions/10868673/…
    猜你喜欢
    • 2012-03-18
    • 2010-10-19
    • 2016-09-30
    • 2019-10-06
    • 1970-01-01
    • 2020-10-27
    • 2012-06-01
    • 2018-12-27
    • 2012-07-22
    相关资源
    最近更新 更多