2015-05-01 18 views
1

我正在为一个GameBoard对象编写单元测试代码,该代码是在C#中制作卡片游戏“Dominion”的项目的一部分。我正在使用rhino mocks来测试运行一段时间的方法(!GameIsOver)。在里面,下一个球员得到了,然后呼吁轮到他们。很多代码还没有实现(例如,player.takeTurn()是空的)。犀牛嘲笑calloriginalmethod调用已过时

在我的单元测试中,我使用Rhino Mocks重写GameIsOver方法多次返回false,然后返回true以在预期时间结束测试,但我需要使用CallOriginalMethod来调用方法I'在GameBoard上进行测试。使用该方法的行告诉我,CallOriginalMethod已过时,并且需要“原始调用选项”,我一直无法找到任何文档。

[TestMethod] 
public void TestTurnOrderUsingMocks() 
{ 
    MockRepository mocks = new MockRepository(); 
    GameBoard fakeBoard = mocks.DynamicMock<GameBoard>(); 
    Player p1 = mocks.DynamicMock<Player>(); 
    Player p2 = mocks.DynamicMock<Player>(); 
    Dictionary<Card, int> cards = GetTestDeck(); 

    using (mocks.Ordered()) 
    { 
     fakeBoard.PlayGame(); 
     for (int i = 0; i < 10; i++) 
     { 
      p1.TakeTurn(); 
      p2.TakeTurn(); 
     } 
    } 
    Expect.Call(fakeBoard.AddPlayer(p1)).CallOriginalMethod(); 
    Expect.Call(fakeBoard.AddPlayer(p2)).CallOriginalMethod(); 
    Expect.Call((()=>fakeBoard.PlayGame())).CallOriginalMethod(); 
    Expect.Call(fakeBoard.GameIsOver()).Repeat.Times(20).Return(false); 
    Expect.Call(fakeBoard.GameIsOver()).Return(true); 
    mocks.ReplayAll(); 
    fakeBoard.PlayGame(); 
    mocks.VerifyAll(); 
} 

public Boolean AddPlayer(Player p) 
{ 
    if (turnOrder.Contains(p)) 
    { 
     Console.WriteLine("that player has already been added!"); 
     return false; 
    } 
    turnOrder.Enqueue(p); 
    return true; 
} 

public virtual void PlayGame() 
{ 
    while (!GameIsOver()) 
    { 
     NextPlayer().TakeTurn(); 
    } 
} 
+1

我编辑了您的标题。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 –

回答

3

你要叫 “CallOriginalMethod” 法 “OriginalCallOptions” 枚举(顺便说一句,你使用RhinoMocks的旧的API ...)

更改您的来电:

 fakeBoard.Stub(x => x.AddPlayer(x => x.AddPlayer(Arg<Player>.Is.NotNull))) 
       .CallOriginalMethod(OriginalCallOptions.NoExpectation) 
       .Return(true); 

还有一件事,方法“PlayGame”必须是虚拟方法(以应用此行为...)