c# - 枚举类型 : variable 'x' of type 'xxx' referenced from scope '' , 的起订量子属性,但未定义

标签 c# unit-testing moq

我试图模拟我用于测试目的的接口(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/

相关文章:

moq - 如何设置 Moq 以执行 Moq 的某些方法

c# - 根据单元测试中传递的参数返回不同的模拟值与最小起订量

c# - 使用 JavaScript onclick 删除元素并在 SQL 中保存变量

unit-testing - 如何测试 EJB 3.0?

java - 如何在基于代理的Spring bean中设置模拟对象?

c# - Moq 断言一个抽象方法被调用

c# - Xamarin iOS 以编程方式将导航栏添加到 TableView

c# - 如何将对嵌套类成员的访问限制为封闭类?

c# - 当我更改设置的漫游属性时,如何保留用户设置的值?

c# - Moq ReturnsAsync() 没有参数