我有一些代码,我正在重构依赖于接口,以便我可以注入依赖项和单元测试/模拟依赖项。
简化时,原始代码看起来像这样:
private Expression<Func<SearchResultItem, bool>> AddFilterByLanguage(Expression<Func<SearchResultItem, bool>> query)
{
Expression<Func<SearchResultItem, bool>> languageQuery = PredicateBuilder.False<SearchResultItem>();
languageQuery = languageQuery.Or(i => i.Language == _searchParams.ContextLanguage);
return query.And(languageQuery);
}
要对此代码进行单元测试,我的计划是添加使用PredicateBuilder和Expression的假实现,以便我可以构建一个虚拟查询并验证相关部分是否被正确调用。
所以我用一个注入的IPredicateBuilder替换了PredicateBuilder,它返回IExpressions而不是如下定义。
public interface IPredicateBuilder
{
IExpression<Func<T, bool>> True<T>();
IExpression<Func<T, bool>> False<T>();
}
public interface IExpression<T>
{
IExpression<Func<T, bool>> And<T>(IExpression<Func<T, bool>> func);
IExpression<Func<T, bool>> Or(IExpression<Func<T, bool>> func);
}
现在更改的代码如下所示:
private IExpression<Func<SearchResultItem, bool>> AddFilterByLanguage(Expression<Func<SearchResultItem, bool>> query)
{
IExpression<Func<SearchResultItem, bool>> languageQuery = _predicateBuilder.False<SearchResultItem>();
languageQuery = languageQuery.Or(i => i.Language == _searchParams.ContextLanguage);
return query.And(languageQuery);
}
其中
private readonly IPredicateBuilder _predicateBuilder;
我的问题是我在这一行得到了“无法解析符号语言”:
languageQuery = languageQuery.Or(i => i.Language == _searchParams.ContextLanguage);
任何关于如何最好地解决这个问题的建议都将受到赞赏。