我想使用 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
或针对列出没有特定属性的方法的根本问题的不同方法的任何帮助,我将不胜感激。
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;
}