未修饰的流畅断言

问题描述 投票:0回答:1

我想使用 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
    }

要么转换失败,要么如果我将结果转换为

IEnumerable<MethodInfo>
我无法链接其他
MethodInfoSelector
方法。

如果您能提供有关如何生成

MethodInfoSelector
或针对列出没有特定属性的方法的根本问题的不同方法的任何帮助,我将不胜感激。

c# asp.net-mvc unit-testing t4mvc fluent-assertions
1个回答
1
投票

Fluent Assertions 目前没有公开的成员允许您执行此操作。 您最好的解决方案是转到 GitHub 上的 Fluent Assertions 项目,然后打开一个问题或提交 Pull 请求,以便在 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.