【发布时间】:2016-06-12 21:18:36
【问题描述】:
我正在moqing一个界面,它有:
Dictionary<string, object> InstanceVariables { get; set; }
我创建了一个新的界面模拟并尝试对其进行设置,使其仅返回一个随机字符串,如下所示:
_mockContext.SetupGet(m => m.InstanceVariables[It.IsAny<string>()]).Returns(@"c:\users\randomplace");
但我似乎得到了一个错误:
{"Invalid setup on a non-virtual (overridable in VB) member: m => m.InstanceVariables[It.IsAny<String>()]"}
这到底是什么意思?我在嘲笑界面,所以这不是问题吗?
谢谢
【问题讨论】:
-
如果可以创建字典,为什么还需要模拟
Dictionary将所有必填字段? -
因为我想在执行我在 mockContext 对象中传递的方法时更改 InstanceVariables 产生的内容
-
您的财产是
Dictionary,而不是IDictionary。因此,要使其编译,您必须模拟具体的实现,不是您所说的接口(尽管我不能确定,因为您没有发布该代码)。因此,错误是正确的 - 您不能覆盖非虚拟成员(并且字典索引器不是虚拟的)。但是,@Valentin 的问题仍然存在 - 为什么不直接创建一个字典,其值设置为单元测试所需的值 - 字典是一个愚蠢的数据存储 - 没有可以模拟的功能!
标签: c# unit-testing testing moq