У меня есть следующий вызов в моем коде:
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'.
и я не уверен, что я делаю неправильно...