2

次のメソッドを持つばかげた "queue-class[1]" があり、Rspec で仕様を特定したいと考えています。ファイルシステムへの書き込みが機能するかどうかのテストには関心がありませんが (機能し、私のコンピューターは機能します)、正しいデータが書き出されるかどうかには関心があります。

def write transaction
  File.open("messages/#{@next_id}", "w") {|f| f.puts transaction }
  @next_id += 1
end

これをテストするための仕様は次のとおりです。

describe TransactionQueue do
  context "#write" do
    it "should write positive values" do
      open_file = mock File
      open_file.stub(:puts)

      File.any_instance.stub(:open).and_yield(open_file)
      File.any_instance.should_receive(:open)
      open_file.should_receive(:puts).with("+100")

      @queue = TransactionQueue.new
      @queue.write("+100")
    end
  end
end

これを実行すると失敗します。これは、モックが予想される「open」および「puts」メッセージを受信しないためです。

私はFileこのように嘲笑することができますか?any_instance正しく使用しましたか?「ブロック利回り」をスタブしようとする私の試みは正しいですか?

回避できる場合は、FakeFS のような追加の gem を使用したくありません。これは、それを機能させることではありません。bu 主に何が起こっているのかを実際に理解することについてです。したがって、余分な宝石/複雑なレイヤーを避けるための私の試み.

[1] クラスはThe Cucumber Bookからのものです。しかし、これらのテストは Cucumber 自体とはほとんど関係がありません。本に従っているときに、どういうわけかコードを壊しました。そして、この本でテストが書かれていない部分、つまりヘルパー クラスの単体テストを書くことによって、何を調べたいと思っています。

4

1 に答える 1

5

メソッドFileを受け取ることを期待するのは、クラスの「インスタンス」ではありません。openそれはFileクラス自体です:

  File.stub(:open).and_yield(open_file)
  File.should_receive(:open)

さらに、スタブと期待値の両方を使用しないでください。File.openそれが実際に呼び出されていることを確認したい場合:

  File.should_receive(:open).and_yield(open_file)

メソッドが呼び出された場合に備えopenてメソッドをスタブしたいだけで、メソッドの動作としてメソッドを要求したくない場合は、次のようにします。@queue.write

  File.stub(:open).and_yield(open_file)

(これはメモリからのものです。私はRSpecを数か月使用していません。)

于 2012-12-29T12:17:23.183 に答える