4

我有一个非常简单的类,有两种方法;一个将被调用,另一个将被调用。这个想法是调用 OuterMockMethod 方法但模拟 InnerMockMethod。现在我似乎只能模拟 OuterMockMethod 方法。

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

1 回答 1

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)。你可以在这里找到更多信息。

于 2008-12-15T23:12:45.227 回答