【发布时间】:2015-05-01 15:45:03
【问题描述】:
我正在为一个 GameBoard 对象编写单元测试代码,该对象是项目的一部分,用于在 C# 中制作纸牌游戏“Dominion”。我正在使用 rhino 模拟来测试一个运行一段时间的方法(!GameIsOver)。在里面,下一个玩家被选中,然后被要求轮到他们。很多此代码尚未实现(例如 player.takeTurn() 为空)。
在我的单元测试中,我使用Rhino Mocks重写方法GameIsOver多次返回false,然后返回true在预期时间结束测试,但是我需要使用CallOriginalMethod来调用我正在使用的方法在 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();
}
}
【问题讨论】:
-
我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
标签: c# unit-testing mocking rhino-mocks