【问题标题】:NUnit tests for testing class-level PrincipalPermissionAttribute demands用于测试类级别 PrincipalPermissionAttribute 需求的 NUnit 测试
【发布时间】:2012-03-01 12:55:34
【问题描述】:

我正在使用 .NET 3.5 和 Nunit 2.5.10。我正在尝试编写一些测试来通过PrincipalPermissionAttribute 在类级别验证我们基于角色的安全实施。测试似乎成功了(它得到一个绿色复选标记),Assert.Throws 调用正确地捕获了异常,并且我关于异常的所有其他断言都通过了。但是,一旦在测试运行后 TearDown 完成,NUnit 会重新抛出异常。因此,即使测试“通过”,每一项测试都表明异常是未处理的异常在“执行”测试运行时被抛出。

我猜我做错了什么,但无法弄清楚。我的测试是:

Public Sub New_TheForm_NoRoles_DeniesAccess()
    ' attempt to create a new instance of the form, but it should throw an exception with an inner SecurityException
    Dim ex As TypeInitializationException = Assert.Throws(Of TypeInitializationException)( _Function() New TheForm(), "Only admins and editors should have access.")
    Assert.That(ex.InnerException, [Is].TypeOf(GetType(SecurityException)), "Initialization should fail because of a SecurityException.")
End Sub

表单在类级别具有 PrincipalPermission 属性,如下所示:

<PrincipalPermission(SecurityAction.Demand, Role:=Security.Roles.ADMINISTRATORS)> _
<PrincipalPermission(SecurityAction.Demand, Role:=Security.Roles.EDITORS)> _
Public Class TheForm

' ... more class code here ...

End Class

除了其他甚至不向用户提供选项的检查外,我们还试图根据收到的角色简单地拒绝对给定表单的访问。角色常量与域安全组相关联,我知道它们可以工作(它们在应用程序运行时正确地允许/拒绝)。

在应用程序的早期,我们确实通过调用UserSecurity.Initialize(Nothing) 来初始化我们的主体策略。单例 UserSecurity 的 Initialize 方法在这里:

Public Shared Sub Initialize(ByRef principalToUse As IPrincipal)
    ' if we don't have a principal, then use the windows principal
    If (principalToUse Is Nothing) Then
        AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal)

    ' otherwise, use the principal passed in
    Else
        Thread.CurrentPrincipal = principalToUse
    End If
End Sub

基本上,Initialize 通常在应用程序中以Nothing 调用,以便我们使用 Windows 主体。在单元测试期间,我们改为使用没有角色的 GenericPrincipal 对其进行初始化,以便我们可以测试是否引发了 SecurityException。

测试正在通过,但 NUnit 似乎只是在 Teardown 后重新抛出异常。有什么想法我可能做错了吗?

【问题讨论】:

    标签: .net vb.net winforms security nunit


    【解决方案1】:

    您的表单是否可以完成,或者您是否在测试中设置“允许”主体的上下文之外处理表单实例(例如,通过 using 语句)?在任何一种情况下,您最终都会尝试在不允许在表单中运行任何方法的用户帐户下运行方法(终结器或 Dispose)。有关更多详细信息和解决方法,请参阅http://msmvps.com/blogs/calinoiu/archive/2006/01/07/why-is-my-application-coughing-up-a-securityexception-after-my-code-stops-running.aspx

    【讨论】:

    • 我真的找到了答案,然后回来看到了你的。你是对的 - 具体来说,问题是因为 Dispose 被调用,但被拒绝。我会给你答案,并在另一个中详细说明解决方法。
    【解决方案2】:

    正如 Nicole Calinoiu 回答的那样,它是由稍后调用 Dispose 引起的,在测试运行之后,导致了 SecurityException。 NUnit 的错误具有误导性,称它是“在测试期间”。

    这里为后代发布的解决方法是确保正确清理 TearDown 中的主体以用于测试夹具。在这种情况下,这意味着确保将 Thread.CurrentPrincipal 重置为具有适当权限的内容,以便 NUnit 可以处理这些内容,即使在测试之后也是如此。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-22
      • 1970-01-01
      相关资源
      最近更新 更多