Тесты NUnit для тестирования требований PrincipalPermissionAttribute на уровне класса - PullRequest
0 голосов
/ 01 марта 2012

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

Ответы [ 2 ]

1 голос
/ 01 марта 2012

Является ли ваша форма финализируемой или вы, возможно, удаляете экземпляр формы (например, с помощью оператора 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.

0 голосов
/ 02 марта 2012

Как ответила Николь Калиною, это было вызвано последующим вызовом Dispose, после выполнения тестов , что привело к исключению SecurityException.Ошибка от NUnit вводила в заблуждение, говоря, что это было «во время теста».

Обходной путь, опубликованный здесь для потомков, заключался в том, чтобы обеспечить правильную очистку принципала в TearDown для тестового прибора.В этом случае это означало необходимость сброса Thread.CurrentPrincipal на что-то с соответствующими разрешениями, чтобы NUnit мог утилизировать вещи даже после теста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...