首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于测试类级NUnit需求的PrincipalPermissionAttribute测试

用于测试类级NUnit需求的PrincipalPermissionAttribute测试
EN

Stack Overflow用户
提问于 2012-03-01 12:55:34
回答 2查看 262关注 0票数 0

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

我猜我做错了什么,但我想不出来。我的测试是:

代码语言:javascript
复制
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属性,如下所示:

代码语言:javascript
复制
<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)来初始化我们的主要策略。singleton UserSecurity的Initialize方法如下:

代码语言:javascript
复制
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

基本上,初始化通常是在应用程序中使用Nothing调用的,这样我们就可以使用Windows主体。在单元测试期间,我们使用一个没有角色的GenericPrincipal来初始化它,这样我们就可以测试抛出一个SecurityException。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-01 16:49:54

您的表单可完成吗?或者您是否正在将表单实例(例如,通过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

票数 1
EN

Stack Overflow用户

发布于 2012-03-02 18:06:08

正如Nicole Calinoiu所回答的那样,这是由于在测试运行后稍后调用Dispose导致的,从而导致了一个SecurityException。来自NUnit的错误是误导性的,说这是“在测试期间”。

为子孙后代发布的解决方法是确保正确地清理TearDown中用于测试夹具的主体。在这种情况下,这意味着确保将Thread.CurrentPrincipal重置为具有适当权限的东西,这样NUnit就可以在测试之后释放一些东西。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9516605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档