gpt4 book ai didi

c# - 使用 Rhino Mocks 的奇怪错误 "type doesn' t 匹配返回值”

转载 作者:太空宇宙 更新时间:2023-11-03 21:44:41 25 4
gpt4 key购买 nike

编辑:我玩过这个例子,现在 my question is a different one entirely .

当我运行这个例子时:

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 : Type 'System.Double' doesn't match the return type 'System.Decimal' for method 'IInterface.GetDecimal();'

为什么?

最佳答案

Rhino Mocks 只能拦截通过 stub 接口(interface)进行的调用。上面的扩展方法被编译成类似这样的东西:

Util.DecToDouble(sr)

这意味着您的设置/返回基本上是这样的:

stubReader.Stub(sr => Util.DecToDouble(sr)).Return(1.2);

这显然行不通(对于大多数模拟框架)。实现你想要的正确方法是:

stubReader.Stub(sr => sr.GetDecimal())).Return(1.2);

经过进一步调查:Rhino Mocks 通过调用传递给 Stub() 的委托(delegate)并保存最后应用的方法调用,在内部将 Stub() 声明的方法连接到 Return() 声明的值。这个保存的方法调用随后连接到返回值。执行此操作时,Rhino Mocks 会在内部检查保存的调用的返回类型是否与值的类型匹配。如果它们不匹配,Rhino Mocks 会引发您看到的异常。定义 stub 的正确方法是

    decimal val = 1.2M;
stubReader.Stub(sr => sr.DecToDouble()).Return(val);

但这不会编译,因为 Stub() 和 Return() 的泛型类型参数必须兼容。所以真正定义 stub 的唯一方法是忽略扩展方法,只 stub 接口(interface)中定义的方法。

关于c# - 使用 Rhino Mocks 的奇怪错误 "type doesn' t 匹配返回值”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17660820/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com