2013-07-17 2 views
1

Je n'arrive pas à comprendre comment tester la sortie avec puts. J'ai besoin de savoir ce que je dois faire dans mon fichier RSPEC.rspec puts test de sortie

Ceci est mon fichier 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 

Ceci est le fichier qu'il teste contre:

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 

NOTE: Je mis à jour mon code Rspec pour refléter les changements que j'ai fait à mon dossier de test donné suggestions trouvées ailleurs. Pour résoudre complètement le problème, j'ai utilisé les modifications suggérées par Chris Heald dans mon fichier principal. Merci à tous et merci Chris.

+0

Pour référence ultérieure: Une fois que vous avez résolu la question, il est préférable de mettre la solution dans une réponse plutôt que de modifier votre question. Si quelqu'un revient à cette question, il est difficile de voir quelle était la question initiale. :) – henrikhodne

Répondre

2

Votre initialiseur doit être:

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

La raison est que attr_accessor génère des méthodes comme celle-ci:

# attr_accessor :game_output 
def game_output 
    @game_output 
end 

def game_output=(output) 
    @game_output = output 
end 

(attr_reader génère uniquement la méthode du lecteur)

Ainsi, puisque vous n'attribuez jamais @game_output, votre méthode game_output retournera toujours zéro.

+0

Ce fut l'indice le plus utile .. J'ai également dû modifier mon test aussi bien ... Je vais essayer de mettre à jour mon code pour refléter les changements – Jessi

2

Il suffit de vérifier que vous l'envoyez le message:

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

Vous pouvez coller et imprimer.

La manière la plus fondamentale est peut-être de réattribuer temporairement STDOUT à une variable et de confirmer que la variable correspond à ce que vous attendez de la sortie. Et Minitest a must_output comme assertion/spec.

Le code est donc:

## 
# 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

J'ai explicitement besoin de rspec. Mais merci. – Jessi

+0

Eh bien, oui. Mais il n'y a absolument aucune raison pour laquelle vous ne pouvez pas utiliser le code ci-dessus, c'est tout simplement Ruby. "def est notre talon" non? Mais le talon vient de la bibliothèque RSpec. Je voulais juste montrer comment cela pourrait aussi être fait avec Plain Ruby, pas de framework. Ou même patcher Rspec, après tout, c'est juste du simple Ruby. Comme vous pouvez le voir à partir de la réponse acceptée ... il est la plupart du temps identique, non? – vgoff