C# 模拟属性Getter使用反射引发异常
我想模拟一个属性,当有人试图从中获取时,我发现该属性使用反射抛出异常。问题是我不知道C# 模拟属性Getter使用反射引发异常,c#,reflection,moq,C#,Reflection,Moq,我想模拟一个属性,当有人试图从中获取时,我发现该属性使用反射抛出异常。问题是我不知道ID的类型。下面是我尝试过的一个例子: internal static T CreateObjectWithExceptioningIDProperty<T>() where T : class { Type type = typeof(T); var moq = new Mock<T>(); var lambdaParameter = Expression.Parameter
ID
的类型。下面是我尝试过的一个例子:
internal static T CreateObjectWithExceptioningIDProperty<T>() where T : class
{
Type type = typeof(T);
var moq = new Mock<T>();
var lambdaParameter = Expression.Parameter(type);
PropertyInfo idProperty = type.GetProperties().First(pi => pi.Name.Equals("ID"));
var lambdaBody = Expression.Property(lambdaParameter, idProperty);
dynamic func = Expression.Lambda(lambdaBody, lambdaParameter);
moq.Setup(func).Throws(new Exception()); // get RuntimeBinderException
return moq.Object;
}
内部静态T CreateObjectWithExceptioningIDProperty(),其中T:class
{
类型=类型(T);
var moq=新模拟();
var lambdaParameter=表达式.参数(类型);
PropertyInfo idProperty=type.GetProperties().First(pi=>pi.Name.Equals(“ID”);
var lambdaBody=Expression.Property(lambdParameter,idProperty);
dynamic func=表达式.Lambda(lambdaBody,lambdaParameter);
moq.Setup(func.Throws(new Exception());//get RuntimeBinderException
返回最小起订量对象;
}
目前,我得到一个RuntimeBinderException:“object”不包含“Throws”的定义。
。我做错了什么
这类似于和。可能
moq.Setup( x => x.Id).Throws(new Exception());
?如果您将
设置的结果强制转换为IThrows
,它会工作。我不知道它为什么失败,你是怎么拥有它的;可能是因为moq.Setup(func)
的运行时类型通常不可见(它是internal
tomoq
)
您的RuntimeBinderException
是因为您不能对动态类型使用扩展方法(因为func
是dynamic
,moq.Setup(func)
也是)。可能将其强制转换为适当的类型,或者不使用扩展方法语法?这是用于单元测试的吗?如果是的话,它有代码气味。是的,用于单元测试,但是它是一个很长的故事(遗留代码)。你可以考虑增加更多的答案,特别是因为你不确定它是正确的。你看起来不那么肯定。但是我忘了提到在编译时我不会知道属性的名称。我打赌这是因为Setup()
是一种扩展方法(就像你上面评论的那样)。@MageWind实际上,我不认为Setup
或Throws
是一种扩展方法。当我写评论时,我猜Throws
是,但我错了。
((IThrows)moq.Setup(func)).Throws(new Exception());