0

私はrspecにかなり慣れていないのでrspec、コマンドラインから入力を取得するためのテストを.iniに書きたいと思っていRubyます。どうすればいいですか?また、テストについて説明します。ありがとう

4

2 に答える 2

2

一般的なアプローチは、そのような種類のオブジェクトをスワップ可能にすることです。あなたの場合、getsは暗黙的に on で呼び出され$stdinます。したがって、デフォルトで「input」と呼ばれるオプションの引数を作成し$stdin、呼び出しを取得できます。

以下は、入力を受け取って結果を返す電卓の簡単な例です。

class Calculator
  def initialize input = $stdin
    @input = input
  end

  def process
    eval @input.gets
  end
end

を実行puts Calculator.new.processして入力1 + 2すると、 が表示されます3

これをテストするための特別なツールは必要ありません。IO オブジェクトを簡単に渡して、テストで直接書き込むことができるからです。IO.pipe はこれに適したオプションです。

describe "Calculator" do
  before do
    reader, @writer = IO.pipe
    @calc = Calculator.new(reader)
  end

  it "can sum up two numbers" do
    @writer.puts "1 + 2"
    result = @calc.process
    result.should eq(3)
  end
end

代わりに StringIO を使用することもできます。これは実際の IO ではなく、UNIX のような環境を必要としません。ただし、書き込むたびにストリームを巻き戻す必要があります。

require "stringio"

describe "Calculator" do
  before do
    @input = StringIO.new
    @calc = Calculator.new(@input)
  end

  it "can sum up two numbers" do
    @input.puts "1 + 2"
    @input.rewind
    result = @calc.process
    result.should eq(3)
  end
end

スタブに対するこのアプローチの利点は、テストの脆弱性が少なく、設計が優れていることです。たとえば、実装を変更して get の代わりに getc を使用することにした場合 (文字を 1 つずつ読み取る)、テストを変更する必要がないため、テストはそれほど脆弱ではありません。また、ファイルなどの別のソースからコマンドを簡単に与えることができるようになったため、設計が改善されましたCalculator.new(File.open("calculated_list.txt"))。または、テストで使用できる偽の IO です。

于 2012-09-18T16:07:09.130 に答える
2

モックを使用して:

STDIN.should_receive(:read).and_return("your string")

また、ここで説明されているアプローチも気に入っています。後者の方があなたのケースにより適していると思います。

于 2012-09-18T13:46:19.340 に答える