使用Moq模拟接口遇变量未定义错误,如何设置枚举子属性?
解决Moq模拟嵌套接口属性时的「variable 'x' of type 'IMyInterface' referenced from scope '', but it is not defined」错误
我来帮你拆解下这个问题——你遇到的错误其实是Moq处理嵌套接口属性时的一个常见小坑,不是什么复杂的底层问题,咱们一步步解决:
错误原因
当你写mymock.Setup(x => x.Prop1.Prop2)时,Moq需要解析这个表达式树,但这里有个关键问题:Moq默认不会自动为嵌套的接口属性创建Mock实例。Prop1是一个接口类型,此时x.Prop1并没有被Moq初始化出对应的Mock对象,导致表达式编译器无法正确识别这个引用,于是抛出了变量未定义的错误。
另外你提到Prop1对应的接口带有CoClass特性,这个其实不影响Moq的使用,Moq只关心接口的定义,不用管CoClass的具体实现~
解决方案:先模拟嵌套接口,再关联到主接口
你需要先为Prop1对应的接口单独创建Mock,设置好它的Prop2属性,再把这个Mock实例绑定到IMyInterface的Prop1上。假设Prop1对应的接口是IProp1Interface,代码示例如下:
// 第一步:模拟Prop1对应的接口,并设置Prop2的返回值 var prop1Mock = new Mock<IProp1Interface>(MockBehavior.Strict); prop1Mock.Setup(p => p.Prop2).Returns(PropTypesEnum.enumvalue); // 第二步:模拟主接口IMyInterface,将Prop1的Mock实例赋值给它的Prop1属性 var mymock = new Mock<IMyInterface>(MockBehavior.Strict); mymock.Setup(x => x.Prop1).Returns(prop1Mock.Object);
这样设置后,当你访问mymock.Object.Prop1.Prop2时,就能正确返回你指定的枚举值,错误也会消失。
额外小技巧:用SetupGet简化属性设置
如果这些属性是只读的,你可以用SetupGet来替代Setup,代码会更清晰直观:
prop1Mock.SetupGet(p => p.Prop2).Returns(PropTypesEnum.enumvalue); mymock.SetupGet(x => x.Prop1).Returns(prop1Mock.Object);
内容的提问来源于stack exchange,提问作者Simo Kivistö
相关产品推荐
相关产品推荐

