RhinoMock - 使用真实对象,但存根一个方法

Phi*_*tle 5 c# asp.net-mvc unit-testing rhino-mocks

我正在针对依赖于MVC Controller的单元测试进行编写IFoo. Foo(实现)有一种我想要存根的方法,但我想保留其他方法.我该如何设置RhinoMock

Foo有几个依赖关系我宁愿嘲笑节省编写代码的附加线和塞满我的测试.

Foo:

public interface IFoo{
    int Method1();
    int Method2();
}

public class Foo : IFoo{
   //lot's of dependencies
   public Foo(IBar bar, IBaz baz, IStackOverflow so){}
}
Run Code Online (Sandbox Code Playgroud)

测试:

[Test]
public void What_I_Have_So_Far(){
    //arrange
    //load the real IFoo from Ninject (DI)
    var mockFoo = new Ninject.Kernel(new MyExampleModule())
                    .Get<IFoo>();

    //I want this test to use the real Method1, but not Method2
    //so stub Method2
    mockFoo
       .Stub(x => x.Method2()) //<---- blows up here
       .Returns(42);

    //act
    var controllerUnderTest = new Controller(mockFoo);
Run Code Online (Sandbox Code Playgroud)

错误:

使用这种方法,RhinoMock抛出异常:

System.InvalidOperationException:对象'MyApplication.MyExampleModule'不是模拟对象.

题:

我怎么能存根method2

我知道我可以创建IFoo一个模拟通道MockRepository.GenerateMock,但后来我必须复制真正的实现Method1.


更新:

布拉德和吉米的解决方案缝都同样适用,我选择布拉德只是因为编写的代码较少.

然而,在进一步研究之后,看起来我需要的是AutoMocker.有接缝是StructureMapMoq的接缝,但不是RhinoMocks:https://github.com/RhinoMocks/RhinoMocks/issues/3

k.m*_*k.m 2

你必须反过来做。创建模拟IFoo并将一些调用重定向到真实IFoo(这必须通过WhenCalled扩展完成):

var realFoo = new Ninject.Kernel(new MyExampleModule()).Get<IFoo>();
var mockFoo = MockRepository.GenerateStub<IFoo>();

mockFoo.Stub(f => f.Method2()).Return(42);
mockFoo.Stub(f => f.Method1())
   .WhenCalled(invocation =>
   {
       invocation.ReturnValue = realFoo.Method2();
   })
   .Return(whateverValue);
Run Code Online (Sandbox Code Playgroud)

Return尽管我们之前几行覆盖了它,但最后一个是必需的。否则Rhino会抛出异常。