2013-07-17 116 views
1

我无法理解如何使用puts测试输出。我需要知道我需要在我的RSPEC文件中做什么。rspec输出测试

这是我RSPEC文件:

require 'game_io' 
require 'board' 


describe GameIO do 
    before(:each) do 
    @gameio = GameIO.new 
    @board = Board.new 
    end 

    context 'welcome_message' do 
    it 'should display a welcome message' do 
     test_in = StringIO.new("some test input\n") 
     test_out = StringIO.new 
     test_io = GameIO.new(test_in, test_out) 

     test_io.welcome_message 
     test_io.game_output.string.should == "Hey, welcome to my game. Get ready to be defeated" 
    end 
    end 

end 

这是该文件是针对测试:

class GameIO 
    attr_reader :game_input, :game_output 
    def initialize(game_input = $stdin, game_output = $stdout) 
    @stdin = game_input 
    @stdout = game_output 
    end 


    def welcome_message 
    output "Hey, welcome to my game. Get ready to be defeated" 
    end 


    def output(msg) 
    @stdout.puts msg 
    end 

    def input 
    @stdin.gets 
    end 

end 

注:我更新了我的RSPEC代码,以反映我对给我的测试文件所做的更改在别处找到的建议为了完全解决这个问题,我使用了我的主文件中Chris Heald提出的修改。谢谢大家,谢谢克里斯。

+0

以供将来参考:一旦你已经解决了这个问题,这是更好地把解决方案中的答案,而不是编辑你的问题。如果有人回到这个问题,很难看出原来的问题是什么。 :) – henrikhodne

回答

2

你的初始化应该是:

def initialize(game_input = $stdin, game_output = $stdout) 
    @game_input = game_input 
    @game_output = game_output 
end 

这样做的原因是,attr_accessor产生这样的方法:

# attr_accessor :game_output 
def game_output 
    @game_output 
end 

def game_output=(output) 
    @game_output = output 
end 

(attr_reader只生成读取器方法)

因此,由于您从未指定@game_output,因此您的game_output方法将始终返回nil。

+0

这是最有帮助的提示..我也必须修改我的测试以及...我会尝试更新我的代码以反映更改 – Jessi

2

只需选中要发送它的消息:

@gameio.should_receive(:puts).with("Hey, welcome to my game. Get ready to be defeated") 
0

你可以存根和打印。

也许最基本的方法是暂时将STDOUT重新分配给一个变量,并确认该变量与您期望的输出相匹配。

而Minitest有must_output作为断言/规范。

的代码是这样的:

## 
# Fails if stdout or stderr do not output the expected results. 
# Pass in nil if you don't care about that streams output. Pass in 
# "" if you require it to be silent. Pass in a regexp if you want 
# to pattern match. 
# 
# NOTE: this uses #capture_io, not #capture_subprocess_io. 
# 
# See also: #assert_silent 

def assert_output stdout = nil, stderr = nil 
    out, err = capture_io do 
    yield 
    end 

    err_msg = Regexp === stderr ? :assert_match : :assert_equal if stderr 
    out_msg = Regexp === stdout ? :assert_match : :assert_equal if stdout 

    y = send err_msg, stderr, err, "In stderr" if err_msg 
    x = send out_msg, stdout, out, "In stdout" if out_msg 

    (!stdout || x) && (!stderr || y) 
end 
+0

我明确需要rspec。但是,谢谢。 – Jessi

+0

好吧,是的。但是绝对没有理由不能使用上面的代码,它只是简单的Ruby。 “def是我们的存根”吧?但存根确实来自RSpec库。我只是想说明如何使用普通的Ruby,没有框架。甚至补丁Rspec,毕竟它只是普通的Ruby。正如你从接受的答案中看到的那样......它大部分是相同的,对吧? – vgoff