Я работаю с .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 находится здесь:
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. Есть идеи, что я могу делать не так?