Ну, необходимо было бы перечислить через все классы во всех блоках, которые загружаются в текущий домен приложения. Чтобы сделать это, Вы звонили бы GetAssemblies
метод на AppDomain
экземпляр для текущего домена приложения.
Оттуда, Вы звонили бы GetExportedTypes
(если Вы только хотите открытые типы), или GetTypes
на каждом Assembly
для получения типов, которые содержатся в блоке.
Затем Вы звонили бы GetCustomAttributes
дополнительный метод на каждом Type
экземпляр, передавая тип атрибута, который Вы хотите найти.
можно использовать LINQ для упрощения этого для Вас:
var typesWithMyAttribute =
from a in AppDomain.CurrentDomain.GetAssemblies()
from t in a.GetTypes()
let attributes = t.GetCustomAttributes(typeof(HelpAttribute), true)
where attributes != null && attributes.Length > 0
select new { Type = t, Attributes = attributes.Cast() };
вышеупомянутый запрос получит Вас, каждый тип с Вашим атрибутом относился к нему, наряду с экземпляром атрибута (атрибутов), присвоенного ему.
Примечание, что, если у Вас есть большое количество блоков, загруженных в Ваш домен приложения, что операция могла быть дорогой. Можно использовать Параллельный LINQ для сокращения времени операции, как так:
var typesWithMyAttribute =
// Note the AsParallel here, this will parallelize everything after.
from a in AppDomain.CurrentDomain.GetAssemblies().AsParallel()
from t in a.GetTypes()
let attributes = t.GetCustomAttributes(typeof(HelpAttribute), true)
where attributes != null && attributes.Length > 0
select new { Type = t, Attributes = attributes.Cast() };
Фильтрация его на определенном Assembly
проста:
Assembly assembly = ...;
var typesWithMyAttribute =
from t in assembly.GetTypes()
let attributes = t.GetCustomAttributes(typeof(HelpAttribute), true)
where attributes != null && attributes.Length > 0
select new { Type = t, Attributes = attributes.Cast() };
И если блок имеет большое количество типов в нем, то можно использовать Параллельный LINQ снова:
Assembly assembly = ...;
var typesWithMyAttribute =
// Partition on the type list initially.
from t in assembly.GetTypes().AsParallel()
let attributes = t.GetCustomAttributes(typeof(HelpAttribute), true)
where attributes != null && attributes.Length > 0
select new { Type = t, Attributes = attributes.Cast() };
Вы можете использовать метод «WhenCalled» для запуска вашего собственного кода при вызове заглушки; почти уверен, что он должен работать и с Mocks. Согласно документации, WhenCalled - это замена / обновление для Callback.
callMonitor.Expect(x => x.HangUp())
.WhenCalled(invocation => callMonitor.InCall = false);
Некоторая информация в конце этого сообщения: http://grahamnash.blogspot.com/2008/10/rhino-mocks-35.html
Могут быть некоторые условия, при которых вам нужно это сделать, но в целом я ожидаю, что вы просто настроите свой макет / заглушку, чтобы он возвращал правильные значения в ответ на ваш код . Единственные исключения из этого, о которых я могу думать, - это частичные имитации, когда вы тестируете одну часть класса и хотите имитировать другие части.
Установить имитацию свойства довольно просто.
callMonitor.Expect( x => x.HangUp() );
callMonitor.Expect( x => x.InACall ).Return( false );
Если callMonitor
является заглушкой, вы можете установить свойство напрямую.
callMonitor.Stub( x => x.HangUp() );
callMonitor.InACall = false;
Да , вы можете использовать метод Обратного вызова :
callMonitor.Expect(x => x.HangUp()).Callback(() => callMonitor.InCall = false);
Я не эксперт по RhinoMocks, но я считаю, что это должно сработать.
SetupResult.For(callMonitor.InACall).Return(false);