C# LINQ Contains语句在复杂对象上使用时的行为与字符串列表不同

C# LINQ Contains语句在复杂对象上使用时的行为与字符串列表不同,c#,linq,moq,C#,Linq,Moq,我是白痴吗?这是一个模拟存储库: Mock<IRepository> repMock = new Mock<IRepository>(); Quote q1 = new Quote { QuoteId = 123 }; Quote q2 = new Quote { QuoteId = 345 }; repMock.Setup(m => m.GetQuotes(It.IsAny<Expression<Func<Quote, bool>>&

我是白痴吗?这是一个模拟存储库:

Mock<IRepository> repMock = new Mock<IRepository>();
Quote q1 = new Quote { QuoteId = 123 };
Quote q2 = new Quote { QuoteId = 345 };
repMock.Setup(m => m.GetQuotes(It.IsAny<Expression<Func<Quote, bool>>>())).Returns((new List<Quote> { q1, q2 }).AsQueryable);
这里使用相同的原理只获取一个字符串,但这失败了。它返回两个字符串:

Assert.AreEqual(1, repMock.Object.GetQuotes(q => q.QuoteId.ToString().Contains("1")).Count());
但是,如果您将字符串拉到它们自己的列表中,并针对该列表运行contains,则它将按预期工作:

List<string> foo = repMock.Object.GetQuotes(q => q.QuoteId.ToString().Contains("3")).Select(q => q.QuoteId.ToString()).ToList();
Assert.AreEqual(1, foo.Where(f => f.Contains("1")).Count());
List foo=repMock.Object.GetQuotes(q=>q.QuoteId.ToString().Contains(“3”)).Select(q=>q.QuoteId.ToString()).ToList();
Assert.AreEqual(1,foo.Where(f=>f.Contains(“1”)).Count());
这是怎么回事?这段代码似乎在生产环境中实际工作,并按预期过滤字符串-它只在单元测试中失败


编辑:我在这里看到了@IvanStoev所说的逻辑,即我将模拟设置为返回两个对象的列表,而不管传入的函数是什么。那么,我怎样才能通过测试来实现这个功能呢?

我认为问题就在这里

repMock.Setup(m => m.GetQuotes(It.IsAny<Expression<Func<Quote, bool>>>()))
    .Returns((new List<Quote> { q1, q2 }).AsQueryable);

我认为问题就在这里

repMock.Setup(m => m.GetQuotes(It.IsAny<Expression<Func<Quote, bool>>>()))
    .Returns((new List<Quote> { q1, q2 }).AsQueryable);
repMock.Setup(m => m.GetQuotes(It.IsAny<Expression<Func<Quote, bool>>>()))
    .Returns((Expression<Func<Quote, bool>> predicate) => 
        (new List<Quote> { q1, q2 }).AsQueryable().Where(predicate));