2016-04-07 4 views
0

Мои методы оформлены с атрибутомКак игнорировать атрибут метода во время выполнения тестов?

[TraceAspect] 
public void Post() 
{ 
} 

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

ответ

1

Вы можете сделать дополнительный метод и вызвать метод внутри метода с атрибутом. Таким образом, вы можете протестировать метод без атрибута.

[TraceAspect] 
public void Post() 
{ 
    PostWithoutAttr(); 
} 

public void PostWithoutAttr() 
{ 
    .... 
} 
+0

Мне нравится это, только проблема PostWithoutAttr должна быть действительно вызвана тестовым кодом, и было бы легко «заразить» систему в целом с ее вызовами, она также не обращается к «глубоким вызовам», – tolanj

+0

Это хорошее решение, но только мой метод - это контроллер, и я выполняю интеграционное тестирование, поэтому в этом случае я не могу напрямую вызвать PostWithoutAttr(). Но я определенно буду помнить об этом для модульных тестов. – wintersolider

3

Атрибуты не являются исполняемым кодом. Это всего лишь метаданные.

Если атрибут «делает» что-то, это потому, что код изменяется во время компиляции на основе атрибутов. Я предполагаю, что вы используете некоторую структуру Aspect, такую ​​как PostSharp, которая обрабатывает это для вас. Если вы декомпилируете полученную DLL-библиотеку, вы увидите, что атрибут исчез, а код вашего метода содержит любой код, который добавляет аспект.

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

Могут быть некоторые способы избежать этого, используя условную компиляцию, хотя она не будет работать очень хорошо. Например, вы можете установить переменную на своем сервере сборки, которая позволяет избежать либо самого атрибута (#if !TESTING), либо задачи сборки, которая обрабатывает преобразование из атрибута в код. Вы можете использовать разные конфигурации сборки, чтобы иметь версии с преобразованием и без него. Но на самом деле все они довольно уродливые.

+0

«Если атрибут« что-то »делает, это потому, что код изменяется во время компиляции на основе атрибутов». => или, стоит отметить, потому что атрибут проверяется во время выполнения через отражение. – tolanj

+0

@Luaan Я использую PostSharp, из которых я унаследовал OnMethodBoundaryAspect пост-резкости в мой класс TraceAspect и настроен. Теперь я использую этот класс Trace Aspcet для ведения журнала трассировки в моих контроллерах. Во время выполнения тестов мне не нужны журналы трассировки, но мне они нужны в производстве. – wintersolider

+0

@wintersolider Да, я ожидал чего-то подобного. Самое простое решение по-прежнему заключалось бы в том, чтобы просто игнорировать трассировки (например, настроить прослушиватель трассировки или что-то еще), и это будет означать, что вы используете производственный код, а не магический-почти-подобный-производственный код. – Luaan

Смежные вопросы