2008-12-15 115 views
4

我有一个非常简单的类有两种方法;一个将被调用,另一个将调用。这个想法是调用OuterMockMethod方法,但模拟InnerMockMethod。现在我只能模仿OuterMockMethod方法。Rhino Mocks:如何在方法调用中模拟方法调用?

public class MockClass : IMockInterface 
{   
    public virtual MockClass InnerMockMethod() 
    { 
     MockClass returnValue; 

     returnValue = new MockClass(); 
     returnValue.SomeMessage = "Not mocked"; 

     return returnValue; 
    } 

    public virtual MockClass OuterMockMethod() 
    { 
     MockClass mock; 

     mock = new MockClass(); 

     return mock.MockedMethod(); 
    } 
} 

现在这个工作,但它不是我想要嘲笑方法:

public void MockTest_Internal() 
{ 
    MockClass returnedClass; 
    MockClass mockProvider; 

    mockProvider = repository.StrictMock<MockClass>(); 
    mockProvider.Expect(item => item.OuterMockMethod()) 
     .Return(new MockClass { SomeMessage = "Mocked" }); 
    repository.Replay(mockProvider); 

    returnedClass = mockProvider.OuterMockMethod(); 

    Assert.IsTrue(returnedClass.SomeMessage == "Mocked"); 
} 

正如你所看到的,它会调用OuterMockMethod它喜欢,但我不希望出现这种情况。我想嘲笑InnerMockMethod,这样当它被OuterMockMethod调用时,它将返回我想要的内容。

public void MockTest_Internal() 
{ 
    MockClass returnedClass; 
    MockClass mockProvider; 

    mockProvider = repository.StrictMock<MockClass>(); 
    mockProvider.Expect(item => item.InnerMockMethod()) 
     .Return(new MockClass { SomeMessage = "Mocked" }); 
    repository.Replay(mockProvider); 

    returnedClass = mockProvider.OuterMockMethod(); //Boom angry Rhino 

    Assert.IsTrue(returnedClass.SomeMessage == "Mocked"); 
} 

回答

7

在这种情况下,你需要把模拟返回的对象上:

MockClass returnedMock = MockRepository.GenerateMock<MockClass>(); 
returnedMock.Expect(rm => rm.InnerMockMethod()) 
      .Return(new MockClass { SomeMessage = "Mocked" }); 
mockProvider.Expect(mp => mp.OuterMockMethod()).Return (returnedMock); 

returnedClass = mockProvider.OuterMockMethod(); 

... 

注意StrictMock已被弃用。现在首选的模式是AAA(Arrange,Act,Assert)。你可以找到更多信息here

+0

再次感谢。非常有帮助。 – 2008-12-15 23:35:09

相关问题