2008-12-15 6 views
4

J'ai une classe très simple avec deux méthodes; Un qui sera appelé et l'autre qu'il appellera. L'idée est d'appeler la méthode OuterMockMethod MAIS simuler le InnerMockMethod. En ce moment je peux seulement sembler me moquer de la méthode OuterMockMethod.Rhino Mocks: Comment simuler un appel de méthode dans un appel de méthode?

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(); 
    } 
} 

Maintenant, cela fonctionne, mais ce n'est pas la méthode que je veux railler:

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"); 
} 

Comme vous pouvez le voir, il appelle la OuterMockMethod qui il aime, mais je ne veux pas. Je veux me moquer de l'InnerMockMethod de sorte que quand il est appelé par OuterMockMethod, il retournera ce que je veux.

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"); 
} 

Répondre

7

Dans ce cas, vous devez mettre la maquette sur l'objet retourné:

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(); 

... 

Notez que StrictMock a été désapprouvée. Le motif préféré est maintenant AAA (Arrange, Act, Assert). Vous pouvez trouver plus d'informations here.

+0

Merci encore. très utile. –

Questions connexes