犀牛嘲笑部分模拟

我试图从一些现有的类测试逻辑。 由于它们非常复杂并且在生产中,因此不可能重新考虑目前的类别。

我想要做的是创建一个模拟对象并测试一个内部调用另一个非常难以模拟的方法的方法。

所以我想为次要方法调用设置一个行为。

但是当我设置方法的行为时,方法的代码被调用并失败。

我是否遗漏了某些东西,或者这是不可能在没有重新分类的情况下进行测试?

我已经尝试了所有不同的模拟类型(Strick,Stub,Dynamic,Partial等),但是当我尝试设置行为时,它们都会调用该方法。

using System; using MbUnit.Framework; using Rhino.Mocks; namespace MMBusinessObjects.Tests { [TestFixture] public class PartialMockExampleFixture { [Test] public void Simple_Partial_Mock_Test() { const string param = "anything"; //setup mocks MockRepository mocks = new MockRepository(); var mockTestClass = mocks.StrictMock(); //record beahviour *** actualy call into the real method stub *** Expect.Call(mockTestClass.MethodToMock(param)).Return(true); //never get to here mocks.ReplayAll(); //this is what i want to test Assert.IsTrue(mockTestClass.MethodIWantToTest(param)); } public class TestClass { public bool MethodToMock(string param) { //some logic that is very hard to mock throw new NotImplementedException(); } public bool MethodIWantToTest(string param) { //this method calls the if( MethodToMock(param) ) { //some logic i want to test } return true; } } } } 

MethodToMock不是虚拟的,因此无法模拟。 您想要做的是使用部分模拟(我在类似于您的情况下完成它),但您想要模拟的方法必须是接口实现的一部分或标记为虚拟。 否则,您无法使用Rhino.Mocks进行模拟。

我建议不要在被测试的类中模拟方法,但是你的情况可能是独特的,因为你不能重构类以使其更容易测试。 您可以尝试显式创建委托以防止在设置调用时调用该方法。

  Expect.Call( delegate { mockTestClass.MethodToMock(param) } ).Return(true); 

或者,切换到使用AAA语法,省略不推荐使用的构造。

  [Test] public void Simple_Partial_Mock_Test() { const string param = "anything"; var mockTestClass = MockRepository.GenerateMock(); mockTestClass.Expect( m => m.MethodToMock(param) ).Return( true ); //this is what i want to test Assert.IsTrue(mockTestClass.MethodIWantToTest(param)); mockTestClass.VerifyAllExpectations(); }