我正在寻找帮助将活动消息输出到命令行窗口的帮助。我知道这可能看起来倒退,但这是我给予的任务。我已经编写了测试,以便它们都通过,但我需要将以下活动转换为命令行窗口。这只是一款类似于Impossible Machine游戏的游戏。
首先,我需要创建一个启动Impossible Machine的过程,然后在完成之前模拟连续启动的每个活动。
根据我的理解,显示的所有消息都应发送到STDOUT频道。这些是已经编写的一些测试:
module ImpossibleMachine
# Input and output constants processed by subprocesses
DOWN_ARROW = 1
UP_ARROW = 2
RIGHT_ARROW = 3
REPEAT_ARROW = 4
END_PROCESS = 5
START_CURRENT = 6
# RSpec Tests
describe Game do
describe "#start The impossible machine game" do
before(:each) do
@process = []
@output = double('output').as_null_object
@game = Game.new(@output)
end
it "sends a welcome message" do
@output.should_receive(:puts).with('Welcome to the Impossible Machine!')
@game.start
end
it "should contain a method created_by which returns the students name" do
myname = @game.created_by
myname.should == "My Name"
end
it "should perform lifts_lever_turns_wheel activity which returns REPEAT_ARROW" do
@output.should_receive(:puts).with("Input: #{UP_ARROW}, Activity: Heave_ho_squeek_squeek")
@process[1] = @game.lifts_lever_turns_wheel(UP_ARROW)
@process[1].should == REPEAT_ARROW
end
it "sends a finishing message" do
@output.should_receive(:puts).with('...Game finished.')
@game.finish
end
end
end
我唯一的知识是我需要像这样启动模块,然后继续在其下面添加代码,以便将活动消息输出到命令行:
module ImpossibleMachine
@process = []
g = Game.new(STDOUT)
希望这是有道理的。
答案 0 :(得分:1)
从您的问题中不太清楚 - 您希望游戏在运行rspec时将其输出显示为STDOUT
吗?
如果是这种情况,我会在发布时解释您的代码中的原因,但不会发生:
创建新游戏@game
时,您可以使用Game.new(@output)
创建新游戏。 @output
是一个double
,这意味着它根本不是一个输出对象,而是一个模拟对象。
顺便说一句,这完全没问题。唯一的问题是它没有实际打印到控制台的任何东西。
如果要进行测试,在实际打印到控制台时,应该传递实际的STDOUT
对象:
before(:each) do
@process = []
@output = STDOUT
@game = Game.new(@output)
end
这将几乎工作,因为它会打印所有消息,除了您在测试@output.should_receive(...)
中存根的消息。要使这些工作正常,您应该为每个期望添加and_call_original
:
@output.should_receive(:puts).with('Welcome to the Impossible Machine!').and_call_original