在设计应用程序时,我正试图成为一名优秀的TDD公民。我正在使用Moq,而且我遇到了一个小的存储库问题。
我的存储库有一个Find方法:
public IEnumerable<T> Find(Expression<Func<T, bool>> where)
{
return _objectSet.Where(where);
}
然后我尝试设置存储库的模拟:
mock.Setup(m => m.Find(c => c.ConferenceID == conferenceID))
.Returns(ConferenceTestObjectContainer.CreateConferences().Where(c => c.ConferenceID == conferenceID).ToList());
如果我直接在测试中对模拟进行测试,测试将会起作用,但是如果我将模拟注入我的生产代码(在这种情况下是一个ASP.NET页面)并测试页面方法,它就不起作用。
Justin Etheredge在他的帖子here中解决了这个问题。问题是调用和设置之间的比较器无法很好地处理表达式。
我遇到的问题是他的比较器功能:
public static Expression<Func<T,bool>> AreEqual<T>(Expression<Func<T,bool>> expr)
{
return Match<Expression<Func<T, bool>>>
.Create(t => t.ToString() == expr.ToString());
}
这会引发编译器错误:
无法从用法推断出方法'Moq.Match.Create(System.Predicate)'的类型参数。尝试明确指定类型参数。
我理解编译器无法推断出“T”的类型,但我不清楚如何解决这个问题。好的Etheredge先生做了这项工作,但我不明白我做错了什么。
TIA。
答案 0 :(得分:0)
好的,所以这个问题是Tumblweed ......
为了记录,我通过派生一个新的特定于实体的存储库来解决这个问题,并添加了一个很好的FindById()方法。
答案 1 :(得分:0)
为什么不使用这样的东西:
public static Expression<Func<T,bool>> AreEqual<T>(Expression<Func<T,bool>> expr)
{
return Match.Create<Expression<Func<T, bool>>>(t => t.ToString() == expr.ToString());
}
通过这种方式,我也在处理通用。