Запуск MSTest с частичным доверием из Visual Studio - PullRequest
4 голосов
/ 12 января 2011

Мне нравится иметь возможность запускать MSTest с частичным доверием. Это позволило бы мне настроить то, что код, который вызывает мой модульный тест, может и не может делать.

Проблема, которую я пытаюсь решить, состоит в том, чтобы позволить моим автоматическим (модульным) тестам не работать, когда используются такие вещи, как файловая система, база данных, системные часы и другие внешние ресурсы. Работая с частичным доверием, я могу настроить, какие действия AppDomain может выполнять, а может и не выполнять. Это позволяет мне обнаруживать места в коде, которые неправильно абстрагируют используемые ресурсы.

Если есть другие способы достижения этого, пожалуйста, дайте мне знать.

1 Ответ

2 голосов
/ 17 января 2011

К сожалению, MSTest не имеет встроенного механизма для этого, и изменения в приложении политики CAS в .NET 4.0 серьезно ограничивают поддерживаемые подходы для этого.

Простейшим подходом к этому было бы ограничение разрешения CAS для AppDomain, созданного MSTest для запуска тестов в конкретной тестовой сборке. Однако текущие версии MSTest не позволяют перехватывать и / или настраивать создание домена приложения. Мы не можем обойти это, добавив код в метод AssemblyInitialize, поскольку изменения политики AppDomain, сделанные после запуска кода в AppDomain, не действуют.

Это в основном оставляет нам единый поддерживаемый механизм для применения ограничений разрешений CAS для тестирования: применение PermissionSet.PermitOnly из метода тестирования или кода, который вызывает метод тестирования. e.g.:

[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/extending-the-visual-studio-unit-test-type-part-1.aspx. Однако я не проверял это, и я не уверен, позволил ли механизм вызова метода теста применить PermitOnly таким образом, чтобы он присутствовал в стеке вызовов для тестируемого кода.

Если у вас их много для создания и использования собственного ITestMethodInvoker, либо он не работает, либо не подходит по-другому, другой вариант - использовать посткомпилятор, такой как PostSharp , чтобы вставить PermitOnly вызовов.

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

...