这是我的代码: [TestMethod] public void LoginUnregisteredUserShouldFail() { Mock<IRepository<User>> _repo = new Mock<IRepository<User>>(); UserServiceForTest target = new UserServiceForTest(_repo.Object, new HashingService()); var unregisteredTestUser = new User() { Email = "a", Nombre = "test", Password = "test" }; var registeredHashedTestUser = new User() { Email = "[email protected]", Nombre = "test", Password = "qUqP5cyxm6YcTAhz05Hph5gvu9M=" }; Expression<Func<User, bool>> expression = a => a.Email == "a"; _repo.Setup(a => a.Single(It.Is<Expression<Func<User,bool>>>(l => l.ToString() == expression.ToString()))).Returns(unregisteredTestUser); Assert.IsFalse(target.ValidateCredentials(unregisteredTestUser)); }我想查询我的仓库的Single方法,匹配Email,并且我希望结果是指定的User。我不知道自己在做什么错,但我总是收到null。编辑:我的实现如下: private string GetUserPasswordFromDbByUserName(string userName) { Expression<Func<User, bool>> ax = a => a.Email == userName; var axx = ax.ToString(); var user = _repo.Single(ax); if (user != null) return user.Password; else return string.Empty; }它接收到一个字符串userName,由于某种原因,.ToString()返回'a =>(a.Email == value(Casita.Services.UserService + c__DisplayClass5).userName)'而不是'a =>(a。电子邮件==“ a”)'。对我来说没有任何意义,但我猜这是比较失败的原因。 最佳答案 您的问题可能是Is表达式参数中的相等比较。当转换为字符串时,它们可能不相同,因此相等比较可能会失败。以下问题详细说明了如何比较[Func]代表:How to check if two Expression<Func<T, bool>> are the same切忌我建议以下方法可能有效。注意,这将使用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);无论如何,核心问题可能是这种比较。马克·格雷夫(Marc Gravell)的答案似乎暗示您使用的方法将起作用,但前提是实际方法的实现中包括变量在内的所有内容都完全相同,并且在对存储库依赖项的调用中以完全相同的状态传递时。我对此的理解是,您将必须具有与用于测试的表达式完全相同的定义,并且在实际的实现中这就是测试。我将尝试调试并查看转换为字符串的每个表达式(您的测试方法中的一个表达式和您的实现中的一个表达式,并检查它们是否完全相同。如果它们是相同的,那么该理论就不适用了。)它削弱了您的测试能力,但是您可以检查是否传入了任何表达式并返回所需的内容。可能对您有用的另一种方法是检查委托的返回是否相同,但这再次是较弱的测试:_repo.Setup(a => a.Single(It.Is<Expression<Func<User,bool>>>(l = l(unregisteredTestUser)== expression(unregisteredTestUser)))).Returns(unregisteredTestUser);关于c# - 带有Moq的MV3测试项目,使用某些表达式时如何返回对象?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9333612/ 10-13 06:30