c# - 模拟将方法调用返回到另一个对象的方法
问题描述
我目前正在对我的代码进行单元测试,并且在使用 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 => u.CreateList()
Non-overridable members (here: User.CreateList) may not be used in setup / verification expressions.
解决方案
问题是,正如它所说;CreateList
不可覆盖,未标记virtual
,输入是具体的 ( User
),而不是接口 ( IUser
)。
因此,要解决此问题,您有 2 个选项:
- 创建一个
IUser
接口并在您的代码中使用它。 - 将目标用户方法标记为
virtual
推荐阅读
- c# - 如何正确创建 C# REST 服务?
- google-apps-script - 如何将谷歌表格数据库与谷歌联系人同步
- c# - 告诉 Json.Net 将 JArray 反序列化为类属性
- excel - 无法将文件保存在特定位置,VBA
- flutter - Flutter - 如何在文本字段中为每个字符加下划线?
- javascript - 如何使用数组函数创建 javascript 承诺链?
- c++ - 返回留在 std::cin 输入缓冲区中的无关值
- swift - 如何在 SwiftUI 中拥有可删除的文本字段列表
- reactjs - React & MUI:移动视图上的导航
- reactjs - 离子反应类型不可分配