我试图模拟我用于测试目的的接口(interface)之一并收到错误:
variable 'x' of type 'IMyInterface' referenced from scope '', but it is not defined
设置模拟时
var mymock = new Mock<IMyInterface>( MockBehavior.Strict );
mymock.Setup( x => x.Prop1.Prop2 ).Returns( PropTypesEnum.enumvalue );
Prop1
也是接口(interface)类型Prop2
类型enum
Prop1
的接口(interface)类型有一个 CoClass 属性
我对 Moq 还很陌生,所以不知道这是因为非常简单的事情还是非常复杂的事情。
完整的错误堆栈(有一些西类牙语 - 抱歉):
en System.Linq.Expressions.Compiler.VariableBinder.Reference(ParameterExpression node, VariableStorageKind storage)
en System.Linq.Expressions.Compiler.VariableBinder.VisitParameter(ParameterExpression node)
en System.Linq.Expressions.ParameterExpression.Accept(ExpressionVisitor visitor)
en System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
en System.Linq.Expressions.ExpressionVisitor.VisitMember(MemberExpression node)
en System.Linq.Expressions.MemberExpression.Accept(ExpressionVisitor visitor)
en System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
en System.Linq.Expressions.ExpressionVisitor.VisitArguments(IArgumentProvider nodes)
en System.Linq.Expressions.ExpressionVisitor.VisitMethodCall(MethodCallExpression node)
en System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor)
en System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
en System.Linq.Expressions.Compiler.VariableBinder.VisitUnary(UnaryExpression node)
en System.Linq.Expressions.UnaryExpression.Accept(ExpressionVisitor visitor)
en System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
en System.Linq.Expressions.ExpressionVisitor.Visit(ReadOnlyCollection`1 nodes)
en System.Linq.Expressions.Compiler.VariableBinder.VisitLambda[T](Expression`1 node)
en System.Linq.Expressions.Expression`1.Accept(ExpressionVisitor visitor)
en System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
en System.Linq.Expressions.Compiler.LambdaCompiler.Compile(LambdaExpression lambda, DebugInfoGenerator debugInfoGenerator)
en Moq.Mock.GetTargetMock(Expression fluentExpression, Mock mock) en C:\projects\moq4\Source\Mock.cs:línea 897
en Moq.Mock.SetupGetPexProtected[T,TProperty](Mock`1 mock, Expression`1 expression, Condition condition) en C:\projects\moq4\Source\Mock.cs:línea 581
en Moq.PexProtector.Invoke[T1,T2,T3,TResult](Func`4 function, T1 arg1, T2 arg2, T3 arg3) en C:\projects\moq4\Source\PexProtector.cs:línea 75
en Moq.Mock.SetupGet[T,TProperty](Mock`1 mock, Expression`1 expression, Condition condition) en C:\projects\moq4\Source\Mock.cs:línea 559
en Moq.Mock.SetupPexProtected[T,TResult](Mock`1 mock, Expression`1 expression, Condition condition) en C:\projects\moq4\Source\Mock.cs:línea 537
en Moq.PexProtector.Invoke[T1,T2,T3,TResult](Func`4 function, T1 arg1, T2 arg2, T3 arg3) en C:\projects\moq4\Source\PexProtector.cs:línea 75
en Moq.Mock.Setup[T,TResult](Mock`1 mock, Expression`1 expression, Condition condition) en C:\projects\moq4\Source\Mock.cs:línea 526
en Moq.Mock`1.Setup[TResult](Expression`1 expression) en C:\projects\moq4\Source\Mock.Generic.cs:línea 362
en [removed my own code line]
Mensaje de Result: System.InvalidOperationException : se hace referencia a la variable 'x' del tipo 'IMyInterface' desde el ámbito '', pero no se ha definido
最佳答案
据我所知,问题可能出在 CoClass 属性上。我自己对这个属性并不熟悉,但它似乎是一种将接口(interface)绑定(bind)到 COM 对象的方法。
查看 VariableBinder ( src ) 的源代码,我发现以下语句:
if (definition == null) {
throw Error.UndefinedVariable(node.Name, node.Type, CurrentLambdaName);
}
方法名和传递的参数让我相信它很可能是抛出异常的位置。
那么为什么会抛出它?
我的猜测是表达式编译器(以某种方式)无法弄清楚您在 CoClass 中指定的实际类型。但这只是一个疯狂的猜测。
您可以尝试在 Prop1
接口(interface)上引用非枚举类型,看看是否有效(也可能提供更多信息来修复它)。还要检查是否可以使用 CoClass 属性实例化接口(interface)(在测试方法中),以确保它能够找到 COM 对象。
关于c# - 枚举类型 : variable 'x' of type 'xxx' referenced from scope '' , 的起订量子属性,但未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48585534/