2012-05-07 2 views
1

免責事項:私はRSpecとTDDを一般的に使い慣れています。RSpec関数内で初期化されたオブジェクト上のany_instanceスタブブック

コマンドを受け取り、それを処理するクラスを生成するコマンドラインインターフェイスをプログラムに書きたいと思います。プログラムの動作方法は、gitやsvnのようなツールに似ています。つまり、 "srs init"を渡してプログラムを初期化したり、 "srs add"を使って何かを追加したりすることができます。

だから私はARGVをとり、次のようになり、特定のハンドラにそれを渡したクラスを持っている:

class CLI 
    def run!(*arguments) 
     command = arguments.shift 
     case command 
     when "init" 
      CLI::Init.new.run!(*arguments) 
     end 
    end 
end 

は私の初期化ハンドラは次のようになります。

class CLI 
    class Init 
     def initialize() 
     end 
     def run!(*arguments) 
     end 
    end 
end 

をI CLIクラスのルーティング機能用のテストスイートを作成しようとしています。私は、次を使用している場合RSpecのは失敗:

describe CLI do 
    it "should launch the Init handler if we pass init" do 
     CLI::Init.any_instance.should_receive(:run!) 
     CLI::run!(*["init"]) 
    end 
end 

私は初期化ハンドラの実行への直接呼び出しでCLI::run!への呼び出しを置き換える場合は、それが通過するが、 any_instanceだけdescribeブロック内に構築/定義されたインスタンス上で動作しますが、私は本当にわからないかのように

describe CLI do 
    it "should launch the Init handler if we pass init" do 
     CLI::Init.any_instance.should_receive(:run!) 
     CLI::Init.new.run!(*[]) 
    end 
end 

i.e.:-に見えます。私のrun!関数内で構築されたインスタンスに対してクラスメソッドが呼び出されたかどうか、または最初にこの機能をテストするためのより良い方法を誰かが私にどのように指導してもらえれば、私は最も感謝しています。

+0

どのように失敗しますか?トレースを表示できますか?あなたのコードは一目瞭然です。 – x1a4

+1

@ x1a4、あなたのコメントを読んだ後もう一度見て、あなたが正しいです!私はこの投稿のコードを簡略化していました。単純化されたコードは正常に動作します。テストする必要があります。投稿前に同じ方法で失敗しました。私の8時間制限が切れたときの問題点を説明する回答を掲載します。 – danielpwright

答えて

0

時には問題を説明することで答えが明らかです。実際には、ハンドラの名前は、「初期化」は、よりこのような、describeブロックにパラメータとして渡されていました:

%w{Init}.each do |cmd| 
    describe CLI do 
     it "should launch the #{cmd} handler if we pass #{cmd}" do 
      CLI.const_get(cmd).any_instance.should_receive(:run!) 
      CLI::run!(*[cmd]) 
     end 
    end 
end 

私は質問を簡素化するためにループを取り出した問題を説明するには、しかし、そうすることで、クラスの名前Initは大文字の「I」で始まり、コマンド行initに渡されるコマンドの名前は小さな「i」で始まります。

"init"コマンドを渡す必要があるときにコマンド "Init"を渡そうとしたため、テストが正しく失敗したことが判明しました。

TL; DR - 元のコードが実際に動作しますか。気にして申し訳ありません。

関連する問題