Phi*_*tle 5 c# asp.net-mvc unit-testing rhino-mocks
我正在针对依赖于MVC Controller的单元测试进行编写IFoo. Foo(实现)有一种我想要存根的方法,但我想保留其他方法.我该如何设置RhinoMock?
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.有接缝是StructureMap和Moq的接缝,但不是RhinoMocks:https://github.com/RhinoMocks/RhinoMocks/issues/3
你必须反过来做。创建模拟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会抛出异常。
| 归档时间: |
|
| 查看次数: |
3546 次 |
| 最近记录: |