Исключение безопасности модульного теста Visual Studio - PullRequest
3 голосов
/ 09 июля 2011

Я работаю над приложением, которое отслеживает очереди печати. Для этого нужно уметь их администрировать. Приложение работает нормально, когда я запускаю его для отладки, однако, когда я пытаюсь выполнить модульное тестирование класса, выдается исключение безопасности. Есть ли способ повысить уровень безопасности визуального студийного теста?

PrintQueue q = new PrintQueue(server, QueueName,
                    PrintSystemDesiredAccess.AdministratePrinter);

выдает исключение: Попытка прозрачного для безопасности метода «MS.Internal.PrintWin32Thunk.PrinterDefaults.Dispose (Boolean)» для доступа к критическому методу безопасности «MS.Internal.PrintWin32Thunk.PrinterDefaults.InternalDispose (Boolean)» завершилась неудачей.

Опять же, исключение не выдается, и класс работает как положено, когда используется вне модульного тестирования. Я пытался запустить Visual Studio в качестве администратора, но все равно получил исключение.

ОБНОВЛЕНИЕ: похоже, я не смогу протестировать этот класс. Библиотека классов, содержащая ее, уже написана на .NET 3.5, поэтому исключение не возникает при использовании класса. Я провел дальнейшие эксперименты и обнаружил, что, хотя эта библиотека классов предназначена для .NET 3.5, класс, выбрасывающий исключение, не может использоваться приложением, нацеленным на .NET 4.0. Тестовые проекты Visual Studio требуются для .NET 4.0.

1 Ответ

0 голосов
/ 09 июля 2011

Ваша проблема вероятно связана с этой известной ошибкой: http://connect.microsoft.com/VisualStudio/feedback/details/552520/methodaccessexception-when-printqueuecollection-disposed

Здесь перечислены два обходных пути, один из которых нацелен на .NET 3.5 вместо 4.0.

Вы уверены, что исключение не выдается в потоке финализатора при отладке? Вы не утверждаете, когда оно утилизируется. Получаете ли вы исключение, если вы явно вызываете dispose, а затем debug? Э.Г.

PrintQueue q = new PrintQueue(server, QueueName,
                PrintSystemDesiredAccess.AdministratePrinter);
q.Dispose();
...