Атрибуты не являются исполняемым кодом. Это всего лишь метаданные.
Если атрибут «делает» что-то, это потому, что код изменяется во время компиляции на основе атрибутов. Я предполагаю, что вы используете некоторую структуру Aspect, такую как PostSharp, которая обрабатывает это для вас. Если вы декомпилируете полученную DLL-библиотеку, вы увидите, что атрибут исчез, а код вашего метода содержит любой код, который добавляет аспект.
Чтобы найти способ избежать этого, вам нужно будет ознакомиться с документацией по вашему аспекту. Тем не менее, не очень хорошая идея тестировать другой код, чем на самом деле, - вы можете посмотреть альтернативные решения, например перенаправить трассировку в другое место или что-то в этом роде.
Могут быть некоторые способы избежать этого, используя условную компиляцию, хотя она не будет работать очень хорошо. Например, вы можете установить переменную на своем сервере сборки, которая позволяет избежать либо самого атрибута (#if !TESTING
), либо задачи сборки, которая обрабатывает преобразование из атрибута в код. Вы можете использовать разные конфигурации сборки, чтобы иметь версии с преобразованием и без него. Но на самом деле все они довольно уродливые.
Мне нравится это, только проблема PostWithoutAttr должна быть действительно вызвана тестовым кодом, и было бы легко «заразить» систему в целом с ее вызовами, она также не обращается к «глубоким вызовам», – tolanj
Это хорошее решение, но только мой метод - это контроллер, и я выполняю интеграционное тестирование, поэтому в этом случае я не могу напрямую вызвать PostWithoutAttr(). Но я определенно буду помнить об этом для модульных тестов. – wintersolider