Ваша проблема, вероятно, в сравнении равенства в параметре выражения Is. Они, вероятно, не совпадают при преобразовании в строки, поэтому сравнение на равенство может быть неудачным. Следующий вопрос подробно описывает, как сравнивать делегаты [Func]:
Как проверить, совпадают ли два выражения >
Конечно, я предполагаю, что может сработать следующее. Обратите внимание, что это будет использовать http://evain.net/blog/articles/2008/02/06/an-elegant-linq-to-db4o-provider-and-a-few-linq-tricks, что может потребовать добавления ссылки / загрузки db4o. На этом я прекратил исследования.
Func<Expression, Expression, bool> eq =
ExpressionEqualityComparer.Instance.Equals;
Expression<Func<User, bool>> expression = a => a.Email == "a";
_repo.Setup(a => a.Single(It.Is<Expression<Func<User,bool>>>(l => eq(l,expression))).Returns(unregisteredTestUser);
Во всяком случае, основная проблема, вероятно, заключается в таком сравнении.
Ответ Марка Гравелла, по-видимому, подразумевает использование метода, который вы используете, будет работать, но только если все, включая переменные в реализации вашего фактического метода, в точности совпадают и передаются в том же состоянии при вызове зависимости репозитория.
Насколько я понимаю, вам нужно иметь точно такое же определение выражения, которое вы используете для тестирования, а в реальной реализации это тестирование.
Я бы попробовал отладку и просмотр каждого выражения, преобразованного в строку (одно в вашем тестовом методе и другое в вашей реализации, и проверил бы, точно ли они совпадают. Если это так, то эта теория выходит за рамки. )
Это ослабляет ваш тест, но вы можете просто проверить, передано ли любое выражение и вернуть то, что вы хотите.
Другая альтернатива, которая может работать для вас, это проверка того, совпадают ли результаты делегатов, но опять-таки это более слабый тест:
_repo.Setup(a => a.Single(It.Is<Expression<Func<User,bool>>>(l = l(unregisteredTestUser)== expression(unregisteredTestUser)))).Returns(unregisteredTestUser);