1

で出力をテストする方法がわかりませんputs。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 が提案した変更を使用しました。みんなありがとう、そしてクリスに感謝します。

4

3 に答える 3

2

メッセージを送信していることを確認してください:

@gameio.should_receive(:puts).with("Hey, welcome to my game. Get ready to be defeated")
于 2013-07-17T23:09:08.373 に答える
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_outputgame_outputメソッドは常に nil を返します。

于 2013-07-17T23:10:09.393 に答える
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
于 2013-07-17T23:16:50.440 に答える