Свободные утверждения, которые не украшены

Я хотел бы использовать FluentAssertions для проверки всех методов, которые не украшены атрибутом NonActionAttribute. (Это уменьшит набор методов действий, автоматически генерируемых T4MVC в качестве заполнителей.)

Моя конкретная проблема связана с объединением методов MethodInfoSelector. Я хотел бы написать что-то вроде этого:

   public MethodInfoSelector AllActionMethods() {
        return TestControllerType.Methods()
            .ThatReturn<ActionResult>()
            .ThatAreNotDecoratedWith<NonActionAttribute>();
   }

    public static MethodInfoSelector ThatAreNotDecoratedWith<TAttribute>(this IEnumerable<MethodInfo> selectedMethods) {
        return (MethodInfoSelector)(selectedMethods.Where(method => !method.GetCustomAttributes(false).OfType<TAttribute>().Any())); // this cast fails
    }

Либо приведение завершается неудачей, либо если я конвертирую свои результаты в IEnumberable, я не могу связать дополнительные методы MethodInfoSelector.

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


person Kevin Swarts    schedule 05.06.2014    source источник


Ответы (1)


В настоящее время у Fluent Assertions нет общедоступных членов, которые позволили бы вам сделать это. Лучшее решение — перейти к проекту Fluent Assertions на GitHub и либо открыть вопрос, либо отправить запрос. Запрос, чтобы исправить это в кодовой базе FA.

Я понимаю, что это может рассматриваться как отсутствие ответа, поэтому для полноты картины я укажу, что вы можете решить эту проблему с помощью отражения, хотя применяются обычные отказы от ответственности в отношении отражения приватных членов. Вот одна из таких реализаций, которая позволит работать цепочке:

public static MethodInfoSelector ThatAreNotDecoratedWith<TAttribute>( this MethodInfoSelector selectedMethods)
{
    IEnumerable<MethodInfo> methodsNotDecorated = selectedMethods.Where(
        method =>
            !method.GetCustomAttributes(false)
                .OfType<TAttribute>()
                .Any());

    FieldInfo selectedMethodsField =
        typeof (MethodInfoSelector).GetField("selectedMethods",
            BindingFlags.Instance | BindingFlags.NonPublic);

    selectedMethodsField.SetValue(selectedMethods, methodsNotDecorated);

    return selectedMethods;
}
person vossad01    schedule 06.06.2014
comment
Спасибо @vossad, я попробовал код, и он скомпилировался, но по крайней мере в одном месте я использую результаты в качестве тестовых примеров NUnit, и это приводит к сбою NUnit. Я думаю, что ваш первый ответ был лучшим. - person Kevin Swarts; 06.06.2014
comment
Я согласен, мы еще не предвидели эту потребность. Либо проблема, либо запрос на слияние решат эту проблему. - person Dennis Doomen; 06.06.2014