Класс модульного тестирования, унаследованный от ContextBoundObject и украшенный ContextAttribute - PullRequest
4 голосов
/ 08 апреля 2010

Я пытаюсь перестроить модульные тесты на существующую кодовую базу. И класс, и метод, который я хочу использовать для модульного тестирования, украшены пользовательскими атрибутами, которые наследуются от ContextBoundObject и ContextAttribute. Я не хочу, чтобы они запускались как часть модульного теста.

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

Как выполнить код модульного теста, который имеет атрибуты класса и метода, наследуемые от ContextBoundObject и ContextAttribute, которые вы не хотите запускать как часть модульного теста?

Заранее спасибо.

1 Ответ

2 голосов
/ 08 апреля 2010

Классы, которые наследуются от ContextBoundObject, выполняют методы, передавая сообщения, а не традиционную модель выполнения на основе стека. Эта способность используется в качестве основы для удаленного взаимодействия и взаимодействия COM. Один из интересных вариантов заключается в том, что становится возможным перехватывать вызовы методов с использованием атрибутов, что допускает своего рода «АОП для бедняков».

Одним из вариантов избавления от логики, предоставляемой атрибутами, будет создание файла конфигурации для переопределения того, какой класс создается при создании нового класса. Эта возможность доступна только для классов, унаследованных от MarshalByRef, который является базовым классом для ContextBoundObject.

Другим вариантом может быть создание экземпляра класса с использованием отражения. То есть, чтобы найти конкретный ConstructorInfo и вызвать его для создания экземпляра. Когда вы просто «новый» экземпляр, вызов направляется в Activator.CreateInstance, который, вероятно, дает вам объект прокси для фактического класса. Создание объекта напрямую может обойти это, хотя это выстрел в темноте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...