Запуск MSTest в частичном доверии из Visual Studio
-
10-10-2019 - |
Вопрос
Мне нравится иметь возможность управлять MSTST в частичном доверии. Это позволило бы мне настроить код, который звонит в модель, может и не может сделать.
Проблема, которую я пытаюсь решить, состоит в том, чтобы позволить моим автоматизированным (единичным) тестам, когда используются такие вещи, как файловая система, база данных, системные часы и другие внешние ресурсы. Запустившись в частичном доверии, я могу настроить, какие действия могут и не могут делать приложение. Это позволяет мне обнаружить места в коде, которые неправильно абстрагируют используемые ресурсы.
Если есть и другие способы достижения этого, пожалуйста, дайте мне знать.
Решение
К сожалению, MSTest не имеет встроенного механизма для этого, и изменения в применении политики CAS в .NET 4.0 сильно ограничили поддерживаемые подходы для этого.
Самый простой подход к этому будет ограничение гранта разрешений CAS на AppDomain, созданном MSTest для запуска тестов в конкретной тестовой сборке. Однако текущие версии MSTest не позволяют перехватить и/или настройку создания AppDomain. Мы не можем обойти это, добавив код в метод Assemblyinialize, поскольку изменения политики AppDomain, сделанные после начала работы кода в AppDomain, не имеют никакого эффекта.
Это в основном оставляет нас с одним поддерживаемым механизмом для применения ограничений разрешений CAS для тестирования: применение разрешения. например:
[TestMethod]
public void SomeTest()
{
SomeStaticTestUtilityClass.TargetPermissionSet.PermitOnly();
// Run the rest of your test code here.
}
Может быть возможно сделать это с помощью пользовательских атрибутов теста, используя подход, описанный при http://blogs.msdn.com/b/vstsqualitytools/archive/2009/09/04/exting-the-visual-studio-unit-test-type-part-1.aspx. Анкет Тем не менее, я не проверял это, и я не уверен, что механизм вызовов метода испытаний позволит применять пропускание способом, что это приведет к тому, что он будет присутствовать в стеке вызовов для тестируемого кода.
Если у вас есть много из них для автора, и использование пользовательского Itestmethodinvoker либо не работает, либо иначе не подходит, другой вариант-использовать посткомпилятор Postsharp Чтобы вставить разрешенные звонки.
Если ничего из этого подходит, и вы не женаты на MSTest, вы также можете рассмотреть вопрос о изменении своей тестовой структуры на тот, который легче расширить.