【发布时间】:2014-02-21 14:35:32
【问题描述】:
我的代码中有以下调用:
var dbResults = new List<CrossReferenceRelationshipEF>();
dbResults = dateTimeFilter == null
? new List<CrossReferenceRelationshipEF>(
CrossReferenceRelationshipRepository.GetAll()
.ToList().OrderBy(crr => crr.ToPartner))
: new List<CrossReferenceRelationshipEF>(
CrossReferenceRelationshipRepository.SearchFor(
crr => crr.HistoricEntries
.Any(he => he.ModifiedDatetime > dateTimeFilter))
.ToList().OrderBy(crr => crr.ToPartner));
我正在尝试使用 FakeItEasy 来验证当 dateTimeFilter 有一个值时,SearchFor(…) 正在我的存储库中使用正确的函数被调用。
所以我的测试看起来像这样:
A.CallTo(() => crossReferenceRelationshipRepositoryMock.SearchFor(A<Expression<Func<CrossReferenceRelationshipEF,bool>>>.That
.Matches(exp => Expression.Lambda<Func<DateTime>>(((BinaryExpression)exp.Body).Right).Compile().Invoke() == filterByDate)))
.MustHaveHappened(Repeated.Exactly.Once);
这是不正确的。
有什么方法可以测试我是否使用正确的表达式调用SearchFor(…)?
crr => crr.HistoricEntries.Any(he => he.ModifiedDatetime > dateTimeFilter)
传递给SearchFor(…) 的实际值是DateTime.MinValue,所以我将断言更改为:
A.CallTo(() => crossReferenceRelationshipRepositoryMock.SearchFor(A<Expression<Func<CrossReferenceRelationshipEF, bool>>>.That
.Matches(exp => Expression.Lambda<Func<DateTime>>(((BinaryExpression)exp.Body).Right).Compile().Invoke() == DateTime.MinValue)))
.MustHaveHappened(Repeated.Exactly.Once);
这是失败的,我得到的例外是
System.InvalidCastException:
Unable to cast object of type 'System.Linq.Expressions.MethodCallExpressionN'
to type 'System.Linq.Expressions.BinaryExpression'.
我不确定我做错了什么......
【问题讨论】:
标签: c# lambda predicate fakeiteasy