是否可以使用Rhino Mocks来存储一个我不关心类型的泛型方法?

Mat*_*ard 6 c# tdd unit-testing rhino-mocks

我有一个带有以下签名的方法,我想要存根:

async Task<T> MyMethod<T>(SomeClass, bool, string, string, string, params object[])
Run Code Online (Sandbox Code Playgroud)

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

我需要在Rhino Mocks中为这个方法创建一个存根,但它希望我提供泛型类型.我希望它适合任何类型的电话.我尝试使用<object>,但它希望使用该特定类型进行调用.

我可以看出为什么这会是一个问题,因为对泛型类型的调用是在编译时处理的,而不是在运行时处理的.

但是,我觉得值得一提,以防万一我错过了一招.

编辑1

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

但问题是,我必须指定类型,然后才能满足该类型.被测系统可能会对我正在存根的方法进行多次调用,我需要一个适合所有类型的"全部捕获".

编辑2

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

Adr*_*man 0

您可以尝试在通用方法中创建存根,并仅返回给定类型的默认实例,如下所示:

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()));
}
Run Code Online (Sandbox Code Playgroud)