私はrspecにかなり慣れていないのでrspec
、コマンドラインから入力を取得するためのテストを.iniに書きたいと思っていRuby
ます。どうすればいいですか?また、テストについて説明します。ありがとう
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 です。
モックを使用して:
STDIN.should_receive(:read).and_return("your string")
また、ここで説明されているアプローチも気に入っています。後者の方があなたのケースにより適していると思います。