Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net NUnit测试用于测试类级PrincipalPermissionAttribute需求_.net_Vb.net_Winforms_Security_Nunit - Fatal编程技术网

.net NUnit测试用于测试类级PrincipalPermissionAttribute需求

.net NUnit测试用于测试类级PrincipalPermissionAttribute需求,.net,vb.net,winforms,security,nunit,.net,Vb.net,Winforms,Security,Nunit,我正在使用.NET3.5和NUnit2.5.10。我试图编写一些测试,通过类级别的PrincipalPermissionAttribute验证基于角色的安全强制。测试似乎成功了(它得到了一个绿色的复选标记),并且Assert.Throws调用正确地捕获了异常,以及我关于异常通过的所有其他断言。但是,一旦测试运行后完成拆卸,NUnit就会重新引发异常。因此,即使测试“通过”,每一个测试都显示一个未经处理的异常。在“执行”测试运行时,异常被抛出 我猜我做错了什么,但我想不出来。我的测试是: Publ

我正在使用.NET3.5和NUnit2.5.10。我试图编写一些测试,通过类级别的
PrincipalPermissionAttribute
验证基于角色的安全强制。测试似乎成功了(它得到了一个绿色的复选标记),并且
Assert.Throws
调用正确地捕获了异常,以及我关于异常通过的所有其他断言。但是,一旦测试运行后完成拆卸,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
基本上,Initialize通常在应用程序中使用
Nothing
调用,因此我们使用Windows主体。在单元测试期间,我们用一个没有角色的GenericPrincipal初始化它,这样我们就可以测试是否抛出了SecurityException


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

你的表单是可终结的吗,或者你是否在测试中设置“允许”主体的上下文之外处理表单实例(例如,通过using语句)?在任何一种情况下,您最终都会尝试在用户帐户下运行一个方法(终结器或Dispose),该用户帐户不允许运行表单中的任何方法。有关更多详细信息和解决方法,请参见。

正如Nicole Calinoiu回答的那样,这是由于测试运行后调用Dispose导致的SecurityException。NUnit的错误具有误导性,称其为“在测试期间”


这里为后人发布的解决方法是确保正确清理测试夹具的
拆卸中的主体。在本例中,这意味着确保将
线程.CurrentPrincipal
重置为具有适当权限的内容,这样NUnit就可以进行处理,即使在测试之后也是如此。

我实际上找到了答案,然后回来看到了你的答案。您是正确的-具体来说,问题是因为调用了Dispose,但被拒绝了。我将给出答案,并在另一个解决方案中详细说明解决方法。
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