C# Rhino mocks calloriginalmethod调用已过时
我正在为GameBoard对象编写一个单元测试代码,该对象是C#中纸牌游戏“Dominion”项目的一部分。我正在使用rhino mocks测试一个运行一段时间(!GameIsOver)的方法。在里面,下一个玩家被抓住,然后被要求轮到他们。很多代码尚未实现(例如,player.takeTurn()为空) 在我的单元测试中,我使用Rhino Mocks重写GameIsOver方法多次返回false,然后返回true以在预期时间结束测试,但我需要使用CallOriginalMethod调用我在GameBoard中测试的方法。使用该方法的行告诉我CallOriginalMethod已经过时,需要“原始看涨期权”,我一直无法找到任何文档C# Rhino mocks calloriginalmethod调用已过时,c#,unit-testing,mocking,rhino-mocks,C#,Unit Testing,Mocking,Rhino Mocks,我正在为GameBoard对象编写一个单元测试代码,该对象是C#中纸牌游戏“Dominion”项目的一部分。我正在使用rhino mocks测试一个运行一段时间(!GameIsOver)的方法。在里面,下一个玩家被抓住,然后被要求轮到他们。很多代码尚未实现(例如,player.takeTurn()为空) 在我的单元测试中,我使用Rhino Mocks重写GameIsOver方法多次返回false,然后返回true以在预期时间结束测试,但我需要使用CallOriginalMethod调用我在Gam
[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();
}
}
[TestMethod]
公共void TestTurnOrderUsingMocks()
{
MockRepository mocks=新建MockRepository();
GameBoard fakeBoard=mocks.DynamicMock();
播放器p1=mocks.DynamicMock();
Player p2=mocks.DynamicMock();
字典卡=GetTestDeck();
使用(mocks.Ordered())
{
fakeBoard.PlayGame();
对于(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();
}
公共布尔AddPlayer(播放器p)
{
if(订单包含(p))
{
WriteLine(“该玩家已经被添加了!”);
返回false;
}
排队(p);
返回true;
}
公共虚拟void游戏()
{
而(!GameIsOver())
{
NextPlayer().TakeTurn();
}
}
您必须使用“OriginalCallOptions”枚举调用“CallOriginalMethod”方法。(顺便说一下,您使用的是RhinoMocks的旧API…)
将您的呼叫更改为:
fakeBoard.Stub(x => x.AddPlayer(x => x.AddPlayer(Arg<Player>.Is.NotNull)))
.CallOriginalMethod(OriginalCallOptions.NoExpectation)
.Return(true);
fakeBoard.Stub(x=>x.AddPlayer(x=>x.AddPlayer(Arg.Is.NotNull)))
.CallOriginalMethod(原始许可选项.NoExpection)
.返回(真);
还有一件事,“PlayGame”方法必须是虚拟方法(要应用此行为…我已编辑了您的标题。请参阅“”,其中的共识是“不,他们不应该”。