【问题标题】:Is it possible to use Rhino Mocks to stub a generic method where I don't care about the type?是否可以使用 Rhino Mocks 来存根我不关心类型的通用方法?
【发布时间】:2015-03-28 10:27:12
【问题描述】:

我想存根具有以下签名的方法:

async Task<T> MyMethod<T>(SomeClass, bool, string, string, string, params object[])

泛型类型 T 是我们期望方法返回的类型(从服务器返回的数据被强制转换为类型 T)。注意不能从传入的参数中推断出来;每次都必须指定。

我需要在 Rhino Mocks 中为这个方法创建一个存根,但它希望我提供泛型类型。我希望它能够满足任何类型的呼叫。我尝试使用&lt;object&gt;,但它随后需要使用该特定类型的调用。

我明白为什么这会是个问题,因为对泛型类型的调用是在编译时处理的,而不是在运行时处理的。

我认为这值得一问,以防我错过了一个技巧。

编辑 1

我应该包括现在我已经实现了一个解决方法,我将我的存根构建器包装在一个辅助方法中,该方法本身就是一个通用方法。

不过,问题在于我必须指定类型,然后只满足该类型。被测系统可能会对我正在存根的方法进行多次调用,我需要一个满足所有类型的“catch all”。

编辑 2

我改进的解决方法是根本不使用 Rhino Mocks。相反,我使用了一个实现接口的模拟类。这使得实现泛型方法并返回默认值(或在构造期间设置的值)变得容易。不过,我仍然想知道在 Rhino Mocks 中是否有可能!

【问题讨论】:

    标签: c# unit-testing tdd rhino-mocks


    【解决方案1】:

    您可以尝试在泛型方法中创建存根,然后只返回给定类型的默认实例,如下所示:

    static void SetUpAStub<T>() 
            where T : new()
    {
        var stub = MockRepository.GenerateStub<IMyInterface>();
        stub.Stub(i => i.MyMethod<T>(null, false, string.Empty, string.Empty, string.Empty))
            .Return(new TaskFactory().StartNew( () => new T()));
    }
    

    【讨论】:

    • 这是我作为临时解决方法所做的,但是被测系统可能会针对不同的类型进行多次调用,并且需要对每个调用进行存根以使其不会出现异常。这就是为什么我需要一个'catch all' 存根。抱歉 - 应该在我的问题中包含这个。
    猜你喜欢
    • 2010-09-26
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    相关资源
    最近更新 更多