Rhino Mocks: How to stub a generic method to catch an anonymous type?

巧了我就是萌 提交于 2019-12-10 01:48:16

问题


We need to stub a generic method which will be called using an anonymous type as the type parameter. Consider:

interface IProgressReporter
{
    T Report<T>(T progressUpdater);
}

// Unit test arrange:
Func<object, object> returnArg = (x => x);   // we wish to return the argument
_reporter.Stub(x => x.Report<object>(null).IgnoreArguments().Do(returnArg);

This would work if the actual call to .Report<T>() in the method under test was done with object as the type parameter, but in actuality, the method is called with T being an anonymous type. This type is not available outside of the method under test. As a result, the stub is never called.

Is it possible to stub a generic method without specifying the type parameter?


回答1:


I'm not clear on your use case but you might be able to use a helper method to setup the Stub for each test. I don't have RhinoMocks so have been unable to verify if this will work

private void HelperMethod<T>()
{
  Func<object, object> returnArg = (x => x); // or use T in place of object if thats what you require
  _reporter.Stub(x => x.Report<T>(null)).IgnoreArguments().Do(returnArg);
}

Then in your test do:

public void MyTest()
{
   HelperMethod<yourtype>();
   // rest of your test code
}



回答2:


To answer your question: no, it is not possible to stub a generic method without knowing the generic arguments with Rhino. The generic arguments are an essential part of the method signature in Rhino, and there is no "Any".

The easiest way in your case would be to just write a hand written mock class, which provides a dummy implementation of IProgressReporter.

class ProgressReporterMock : IProgressReporter
{
    T Report<T>(T progressUpdater)
    {
      return progressUpdater;
    }
}


来源:https://stackoverflow.com/questions/6186412/rhino-mocks-how-to-stub-a-generic-method-to-catch-an-anonymous-type

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!