Rhino 模拟调用原始方法调用已过时
Rhino mocks calloriginalmethod call is obsolete
我正在为 GameBoard 对象编写单元测试代码,该对象是用 C# 制作纸牌游戏 "Dominion" 项目的一部分。我正在使用犀牛模拟来测试运行一段时间的方法(!GameIsOver)。在里面,下一个玩家被叫到,然后轮到他们。很多代码还没有实现(例如 player.takeTurn() 是空的)。
在我的单元测试中,我使用 Rhino Mocks 多次将 GameIsOver 方法重写为 return false,然后 return true 以在预期时间结束测试,但我需要使用 CallOriginalMethod 调用我在 GameBoard 中测试的方法。使用该方法的行告诉我 CallOriginalMethod 已过时并且需要 "original call options" 我一直无法找到任何文档。
[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();
}
}
您必须使用 "OriginalCallOptions" 枚举调用 "CallOriginalMethod" 方法。(顺便说一下,您使用 RhinoMocks 的旧 API...)
将您的来电更改为:
fakeBoard.Stub(x => x.AddPlayer(x => x.AddPlayer(Arg<Player>.Is.NotNull)))
.CallOriginalMethod(OriginalCallOptions.NoExpectation)
.Return(true);
还有一点,方法 "PlayGame" 必须是虚方法(以应用此行为...)
我正在为 GameBoard 对象编写单元测试代码,该对象是用 C# 制作纸牌游戏 "Dominion" 项目的一部分。我正在使用犀牛模拟来测试运行一段时间的方法(!GameIsOver)。在里面,下一个玩家被叫到,然后轮到他们。很多代码还没有实现(例如 player.takeTurn() 是空的)。
在我的单元测试中,我使用 Rhino Mocks 多次将 GameIsOver 方法重写为 return false,然后 return true 以在预期时间结束测试,但我需要使用 CallOriginalMethod 调用我在 GameBoard 中测试的方法。使用该方法的行告诉我 CallOriginalMethod 已过时并且需要 "original call options" 我一直无法找到任何文档。
[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();
}
}
您必须使用 "OriginalCallOptions" 枚举调用 "CallOriginalMethod" 方法。(顺便说一下,您使用 RhinoMocks 的旧 API...)
将您的来电更改为:
fakeBoard.Stub(x => x.AddPlayer(x => x.AddPlayer(Arg<Player>.Is.NotNull)))
.CallOriginalMethod(OriginalCallOptions.NoExpectation)
.Return(true);
还有一点,方法 "PlayGame" 必须是虚方法(以应用此行为...)