【发布时间】:2015-06-02 23:50:43
【问题描述】:
我正在针对依赖于IFoo 的 MVC 控制器编写单元测试。 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){}
}
测试:
[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);
错误:
使用这种方法,RhinoMock 会抛出异常:
System.InvalidOperationException : 对象“MyApplication.MyExampleModule”不是模拟对象。
问题:
我如何存根method2?
我知道我可以通过MockRepository.GenerateMock 创建IFoo 作为模拟,但是我必须复制Method1 的真实实现。
更新:
Brad 和 Jimmy 的解决方案都工作得很好,我选择了 Brad 的只是因为它编写的代码更少。
但是,在进一步研究之后,看起来我需要的是一个 AutoMocker。 StructureMap 和 Moq 有一个接缝,但 RhinoMocks 没有:https://github.com/RhinoMocks/RhinoMocks/issues/3
【问题讨论】:
-
好问题。你能不
GenerateMock的实现类(Foo)吗?您不必复制真正的实现——它将是实际的类,但是 RhinoMocks 可以设置method2。要么将方法标记为virtual? -
@RowanFreeman - 我一直在试验
GenerateMock和GeneratePartialMock,但是如果我模拟Foo类,RhinoMock 会爆炸,因为Foo没有无参数构造函数.所以这就引出了一个问题:如何让 RhinoMocks 与 DI 配合得很好,特别是 Ninject? -
TestFoo : Foo和使用public new Int32 Method2()隐藏原始实现怎么样(然后,显然,与 ninject 连接)。 -
@BradChristie - 原则上这是可行的(它不适用于
new,原始方法必须是virtual,TestFoo必须是override它)。但这让我很困扰,因为我编写的代码似乎比我需要的要多。并且我对需要将我的所有方法标记为虚拟并不感到兴奋。
标签: c# asp.net-mvc unit-testing rhino-mocks