【问题标题】:Mocking a method that returns a method call to another object模拟将方法调用返回到另一个对象的方法
【发布时间】:2020-11-03 13:26:41
【问题描述】:

我目前正在对我的代码进行单元测试,但在使用 Moq 创建模拟时遇到了问题。我正在对 Foo 进行单元测试,我希望模拟 User.GetSomething() 来隔离测试。我创建了一个我希望测试的代码的快速示例:

public class User(){
    public List<int> GetSomething(){
         return bar.CreateList();
     }
}


public class Foo(User user){
   public int SomeMethod() {
      var x = User.GetSomething()
      Do something with x
      ...
    }
}

我尝试通过执行以下操作来创建模拟。我已经排除了这个问题的断言和不必要的安排:

var mock = new Mock<User>();
List<int> someList = new List<int>(){1, 2, 3};
mock.Setup(u => u.CreateList()).Returns(SomeList);

Foo(mock.object)
var res = Foo.SomeMethod();
etc.

但我得到了例外:System.NotSupportedException : Unsupported expression: u =&gt; u.CreateList()

Non-overridable members (here: User.CreateList) may not be used in setup / verification expressions.

【问题讨论】:

  • 你不能模拟不可覆盖的方法。在您的情况下,您可以将 GetSomething() 更改为关注public virtual List&lt;int&gt; GetSomething()
  • @SergeyAnisimov 这应该是一个答案

标签: c# unit-testing mocking moq


【解决方案1】:

问题是,正如它所说的那样; CreateList 不可覆盖,未标记为 virtual,并且输入是具体的 (User),而不是接口 (IUser)。

因此,要解决此问题,您有 2 个选项:

  1. 创建一个IUser 接口并在您的代码中使用它。
  2. 将目标用户方法标记为virtual

【讨论】:

    【解决方案2】:

    你不能模拟不可覆盖的方法。在您的情况下,您可以将 GetSomething() 更改为以下内容:public virtual List&lt;int&gt; GetSomething()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多