编辑:我打了这个例子,现在我的问题是完全不同的一个 。
当我运行这个例子:
using Rhino.Mocks;
public interface IInterface
{
decimal GetDecimal();
}
static class Util
{
public static double? DecToDouble(this IInterface input)
{
return (double) input.GetDecimal();
}
}
class MockExample
{
public void RunThis()
{
var stubReader = MockRepository.GenerateStub<IInterface>();
stubReader.Stub(sr => sr.DecToDouble()).Return(1.2);
}
}
我得到这个错误:
System.InvalidOperationException:类型“System.Double”不为方法匹配的返回类型“System.Decimal”“IInterface.GetDecimal();”
为什么?
犀牛制品只能拦截调用,通过存根接口进行。 扩展上面的方法被编译成这样的:
Util.DecToDouble(sr)
这意味着,你的设置/基本回报读取这样的:
stubReader.Stub(sr => Util.DecToDouble(sr)).Return(1.2);
这显然是行不通的(大部分嘲弄框架)。 达到你想要什么正确的方法是:
stubReader.Stub(sr => sr.GetDecimal())).Return(1.2);
经过进一步调查:犀牛嘲笑内部连接()通过调用()传递给存根的委托和保存上一次应用的方法调用由返回()公布值由存根声明的方法。 这种保存方法调用之后连接到返回值。 做这件事时犀牛嘲笑内部检查保存调用的返回类型是否值的类型相匹配。 如果它们不匹配犀牛制品引发你所看到的例外。 正确的方法来定义磕碰会
decimal val = 1.2M;
stubReader.Stub(sr => sr.DecToDouble()).Return(val);
但是,这并不编译,因为存根()和返回()的泛型类型PARAMS必须兼容。 所以,真正定义磕碰的唯一方法是忽略扩展方法,只存根接口中定义的方法。
如果你想嘲笑IInterface
那么你磕碰错误的方法:
public void RunThis()
{
var stubReader = MockRepository.GenerateStub<IInterface>();
stubReader.Stub(sr => sr.GetDecimal()).Return(1.2);
}
如果你想存根DecToDouble
,你不能与RhinoMocks。 扩展方法编译成不能被RhinoMocks,因为他们是在编译时绑定被嘲笑的静态方法调用。 一些存根框架使用低级别的探查调用拦截静态电话,但RhinoMocks不具备这种能力,我知道的。
见这个问题进行类似的讨论。