使用RSpec进行测试 - 将活动消息输出到Ruby中的STDOUT

时间:2014-04-28 15:14:06

标签: ruby rspec tdd stdout

我正在寻找帮助将活动消息输出到命令行窗口的帮助。我知道这可能看起来倒退,但这是我给予的任务。我已经编写了测试,以便它们都通过,但我需要将以下活动转换为命令行窗口。这只是一款类似于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)

希望这是有道理的。

1 个答案:

答案 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