1

免責事項:私は一般的にRSpecとTDDに非常に慣れていないので、これを完全に間違った方法で行っている可能性があります。

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

したがって、ARGVを受け取り、それを特定のハンドラーに渡すクラスがあります。これは次のようになります。

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

私のInitハンドラーは次のようになります。

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

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!ただし、への呼び出しをInitハンドラーの実行への直接呼び出しに置き換えると合格します。すなわち:-

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

any_instanceは、describeブロック内で定義/構築されたインスタンスでのみ機能するように見えますが、よくわかりません。run!関数内に構築されたインスタンスでクラスメソッドが呼び出されたことを確認する方法、または最初にこの機能をテストするためのより良い方法について、誰かが私にガイダンスを提供してくれるなら、私は最も感謝しています。

4

1 に答える 1

0

問題を説明すると答えが明らかになることがあります。実際には、ハンドラーの名前「Init」がパラメーターとして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」で始まり、コマンドの名前はコマンドに渡されました。 line、initは、小さな「i」で始まります。

したがって、コマンド「init」を渡す必要があるときにコマンド「Init」を渡そうとしたため、テストは正しく失敗したことがわかりました。

TL; DR--元のコード実際に機能します!ご迷惑をおかけして申し訳ありません。

于 2012-05-08T09:08:45.740 に答える