【问题标题】:Mock My.User.IsInRole() error in Asp.Net MVC在 Asp.Net MVC 中模拟 My.User.IsInRole() 错误
【发布时间】:2018-05-01 13:55:13
【问题描述】:

我有一个单元测试来模拟以下控制器中使用的My.User.IsInRole()

Public Class BookingController
    Public Function GetUserRole() As String
        If My.User.IsInRole("Agent") Then
             result = "Login as Agent"
        End If

        ```
    End Function
 End Class

尝试在此测试用例中设置模拟(VB 代码):

<TestMethod()>
Public Sub Test()
    //Arrange
    'Dim httpContext = New Mock(Of System.Web.HttpContextBase)()
    Dim principal = New Moq.Mock(Of IPrincipal)()

    'httpContext.Setup(Function(x) x.User).Returns(principal.[Object])
    principal.Setup(Function(p) p.IsInRole("Agent")).Returns(True)
    Thread.CurrentPrincipal = principal.[Object]

    // Act
    Dim result = controller.GetUserRole()

End Sub

调用GetUserRole()时,My.User.IsInRole("Agent")应该返回True,但它返回False。我的代码有什么问题吗?

关于此错误的任何建议。

【问题讨论】:

  • 尝试使用p.IsInRole(It.IsAny(Of String)()) 进行设置,看看是否会有所不同。被比较的编码文本可能是一个问题。
  • 您还应该参考Moq Quickstart 以更好地了解如何使用模拟框架
  • @Nkosi 谢谢。我尝试使用起订量快速入门中指定的 It.IsAny(..),但出现异常错误:screencast.com/t/NT6Hzy6snmN
  • 重新阅读错误信息。当Returns 中的回调需要一个函数时,您有一个 Sub,因为它应该返回一个值
  • 如果将原理模拟分配给当前线程原理,则原始代码正在工作。

标签: asp.net-mvc vb.net unit-testing moq


【解决方案1】:

你需要将principal mock分配给当前线程的principal,(下面是c#代码希望你能解释一下)

    // Make fack principle instance
    var fackPrinciple = new Mock<IPrinciple>();

    // Setup fack data
    fackPrinciple.Setup(e => e.IsInRole(It.IsAny<String>)).Returns(true);

    // Assign to current thread principle
    Thread.CurrentPrincipal = fackPrinciple.Object;   

如果有任何问题请告诉我?

【讨论】:

  • 非常好,通过将模拟分配给当前线程原理,它可以完美地工作。非常感谢@programtreasures。
  • 我刚刚创建了另一个问题来模拟两个主要对象,如果我模拟单个对象,它就可以工作,但不适用于两个主要模拟,因为当前原理只能分配给一个模拟对象。想知道你是否对此有任何想法。谢谢。
  • @Julia 我不知道你为什么要模拟两个主要对象,但你做不到。
  • 我模拟了两个原则,因为它适用于不同的原则成员,现在我尝试对两个成员函数使用一个原则,但它不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-16
  • 2011-02-08
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 2012-05-18
相关资源
最近更新 更多