2

私は非常に小さなgemを作成して、画像データ形式を読み取り、a)narrayが要求されているかどうか、b)narray gemが利用可能かどうかに応じて、退屈なルビー配列または素敵なnarrayとして画像を返します。必要。私の設計では、誰かがnarrayを使用したい場合は使用できますが、事前に明示的に要求する必要があります。画像データを読み取るとき、narrayが定義されているかどうかを確認し(必須)、後で印刷/ログ記録するためにmsgインスタンス変数に警告を追加するだけです。

このテストを含めたいのですが(モックにrspec2とmochaを使用しています)、実際にrspecを使用するのは少し新しいです。私は次のようなことをしたいと思います:

it "should return an narray if requested" do
  obj = NRead.new(@string, :bin => true, :narray => true)
  obj.image_narray.should_not be_nil
end

it "should add an NArray Install message and not set the image_narray if NArray was not available" do
  Object.stubs(:defined?).with(:NArray).returns(:false)
  obj = NRead.new(@string, :bin => true, :narray => true)
  obj.msg.should_not be_empty
  obj.msg.grep(/Please gem install narray/).empty.should be_false
  obj.image_narray.should be_nil
  obj.image_ruby_array.size.should == @fixture_image_length
end

...しかし、このスタブは定義済みの動作を変更しないため、スタブを使用するポイントを見逃しているに違いありません。スタブに関係なく、定義されていますか?「実際の」値を返します(つまり、コードでrequireのコメントを外すと、defined?はfalseになり、警告が正常に追加されます)。

これはテストする価値さえありませんか?これを行うためのより良い方法はありますか?どんな考えでもいただければ幸いです。ありがとう、

4

1 に答える 1

2

定義されていますか?Objectのメソッドではありません。これが、スタブが機能していない理由です。ルビー演算子です。オペレーターをスタブアウトする方法がわかりません。これはコードの機能にとって重要であるため、テストする価値があります。

これをテストするには、kernel.load情報を持つrubyの$ "配列からgemをポップし、ブロックの前に呼び出します。

Object.send(:remove_const, :NArray)

その後、ブロック後にそれを再要求することができます。それは少しハックです、おそらくもっと良い方法があります。

于 2011-01-28T17:07:23.433 に答える