rspec3で標準入力と標準出力のテスト

rspecで標準入力からユーザの入力を受け取って標準出力に出力する方法の覚書 rspec2とrspec3がまざっててややこしかった

プロダクションコード

solver.rb

getでユーザの入力を受け取ってprintで標準出力に答え(文字列)を出力するのクラス

class Solver
  attr_reader :n

  def get
    @n = gets
  end

  def print
    puts 'answer is foo'
  end
end

テストコード

solver_spec.rb

標準入力ではallow(ARGF).to receive(:gets) { 1000 }とするといいらしい. 1000の部分を入力したい値に変更すればいい.

標準出力はoutput("answer is foo\n").to_stdoutとするといいらしい. "answer is foo\n"の部分を出力したい値に変更すればいい.

require 'solver'

describe Solver do
  let(:solver) { described_class.new }

  describe 'solver#getは標準入力を受け取って@nにセットする' do
    before do
      allow(ARGF).to receive(:gets) { 1000 }
      solver.get
    end

    it { expect(solver.n).to eq 1000 }
  end

  describe 'solver#printは標準出力に答えを出力する' do
    it { expect { solver.print }.to output("answer is foo\n").to_stdout }
  end
end

参考