【问题标题】:System.NotSupportedException: Unsupported expression: p => (p.UserProfileId == 1)System.NotSupportedException:不支持的表达式:p =>(p.UserProfileId == 1)
【发布时间】:2012-07-16 10:10:47
【问题描述】:

我有一个使用 System.Func 表达式的测试。它应该很简单,但测试总是失败。

测试:

  [TestMethod]
  public void GetUser()
  {
    var username = "john@resilientplc.com";
    var user = new User() { UserId = 1, Username = username, Password = "123456789" };

    someDataMock.Setup(s => s.GetUser(p => p.UserId == 1)).Returns(user);

    var result = userProfileModel.GetUser(user.UserId);
    Assert.AreEqual(user, result);
  }

实现UserProfileModel

public User GetUser(long userId)
{
  return someDataMock.GetUser(u => u.UserId == UserId);
}

错误:

System.NotSupportedException:不支持的表达式:p => (p.UserId == 1)

知道我的测试在哪里不正确吗?

【问题讨论】:

  • EF 还是 Linq2SQL?如果有的话,这将无法通过IQueryable 工作。
  • someDataMock 的类型是什么?如果是UserProfileModel,那么查看Setup 中调用的参数与参数类型...
  • @leppie 它看起来像是由 Moq 库创建的模拟对象。
  • 什么是 UserProfileId?它似乎没有在任何地方定义。
  • 是的,我用它来创建起订量。 @leppie 我正在使用 EF。我几乎可以肯定它在代码的正常执行期间工作。在测试中不起作用

标签: c# asp.net-mvc-3 unit-testing moq


【解决方案1】:

假设您使用的是 Moq 并且 someDataMock 是一个模拟对象,那么问题出在设置上。试试这个...

someDataMock.Setup(s => s.GetUser(It.IsAny<Func<User, bool>>()).Returns(userProfile);

这应该可行,但您可能希望根据您的测试的性质,使模拟在它接受的回调方面更具限制性。

【讨论】:

  • 是的,这行得通 - 必须添加 someDataMock.VerifyAll 否则测试不会进行太多测试。仍然想更具体​​地说明我发送给 someDataMock 的 Func。
  • @Newton yeh 我不确定是否可以在 Moq 中限制 Func/Action 参数设置的性质。但是我想说,无论哪个类发送这些函数都应该有自己的单元测试来验证它们是否正确。决定它收到的回调是否正确/在上下文中可能不是存储库的责任。
猜你喜欢
  • 2020-12-27
  • 2020-03-16
  • 1970-01-01
  • 2011-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-08
相关资源
最近更新 更多