表达式<func <t,bool =“”>&gt;与It.IsAny总是返回true </func <t,>

时间:2012-11-16 22:26:38

标签: c# unit-testing generics moq expression-trees

我正在尝试创建一个通用的测试类来测试我的通用控制器。一切都很好,除了这个: 我有这样的方法:

private T GetSingle(Expression<Func<T, bool>> expression)

我正试图像这样设置测试:

var Guids = new[] { Guid.NewGuid(), Guid.NewGuid() };
var items = Guids.Select(x => new T {Id = x});
var mock = new Mock<IRepository<T>>();
mock.Setup(m => m.GetSingle(
    It.IsAny<Expression<Func<T, bool>>>()))
   .Returns(new T());

执行这样的测试:

var value = Repository.GetSingle(x=> x.Id == Guid.NewGuid());

始终返回新的T.

我的设置错了吗?

1 个答案:

答案 0 :(得分:8)

无论提供什么表达式,您都会指示Moq返回相同的实例(在本例中为new T()),无论何时调用GetSingle。你真正想要的是它调用items的表达式:

mock.Setup(m => m.GetSingle(It.IsAny<Expression<Func<T, bool>>>()))
   .Returns<Expression<Func<T, bool>>>(expression => items.AsQueryable().Single(expression));