Насмешки носорога - Набор свойство, если метод называют

Ну, необходимо было бы перечислить через все классы во всех блоках, которые загружаются в текущий домен приложения. Чтобы сделать это, Вы звонили бы 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() };

8
задан Vaccano 28 August 2009 в 21:07
поделиться

4 ответа

Вы можете использовать метод «WhenCalled» для запуска вашего собственного кода при вызове заглушки; почти уверен, что он должен работать и с Mocks. Согласно документации, WhenCalled - это замена / обновление для Callback.

callMonitor.Expect(x => x.HangUp())
.WhenCalled(invocation => callMonitor.InCall = false);

Некоторая информация в конце этого сообщения: http://grahamnash.blogspot.com/2008/10/rhino-mocks-35.html

11
ответ дан 5 December 2019 в 14:04
поделиться

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

Установить имитацию свойства довольно просто.

callMonitor.Expect( x => x.HangUp() );
callMonitor.Expect( x => x.InACall ).Return( false );

Если callMonitor является заглушкой, вы можете установить свойство напрямую.

callMonitor.Stub( x => x.HangUp() );
callMonitor.InACall = false;
1
ответ дан 5 December 2019 в 14:04
поделиться

Да , вы можете использовать метод Обратного вызова :

 callMonitor.Expect(x => x.HangUp()).Callback(() => callMonitor.InCall = false);
1
ответ дан 5 December 2019 в 14:04
поделиться

Я не эксперт по RhinoMocks, но я считаю, что это должно сработать.

SetupResult.For(callMonitor.InACall).Return(false);
-1
ответ дан 5 December 2019 в 14:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: