64

はい、プライベートメソッドをテストするのは良い考えではないことを私は知っています(そして私はこのスレッドを読みました - http://www.ruby-forum.com/topic/197346 - そして他のいくつか)

しかし、どうすれば次のコードをテストできますか?

xmpp4rを使用しています。私のパブリック メソッドでは、次の#listenような jabber メッセージの受信を開始します。

def listen
  @client.add_message_callback do |m|
    do_things_with_message(m)
  end
end

private
def do_things_with_message(m)
  #
end

#add_message_callback- メッセージが来ると、ブロックを実行します (別のスレッドで)

したがって、テスト#listen方法は難しく、私のテストよりも xmpp4r のテストの方が多いです。#do_things_with_message

どうすれば大丈夫#do_things_with_messageですか?:) ( http://www.ruby-forum.com/topic/197346#859664 )

プライベートメソッドを新しいオブジェクトにリファクタリングすることは、本質的にそれらをパブリックにすることです(そして1つのメソッドを持つクラス-それは無意味です

編集: これは、クリーンなコードと正しいテストに関する理論的な質問です。私の最初のリンクでは、人々はプライベートメソッドのテストが不十分であると主張しています。でチートしたくありません#sendが、リファクタリングする実行可能な方法も見当たりません

4

3 に答える 3

122

メソッドを使用してsend、Ruby でプライベート メソッドを呼び出すことができます。このようなもの:

@my_object = MyObject.new
@my_object.send(:do_things_with_message, some_message)

次のようなテストで:

it "should do a thing" do
  my_object = MyObject.new
  my_object.send(:do_things_with_message, some_message)
  my_object.thing.should == true
end
于 2013-05-16T23:49:57.797 に答える
3

言及したすべてのリソースでこの考えを聞いたことがあるでしょうが、それを行う適切な「理論的な」方法は、 receive をテストして@clientからadd_message_callback、プライベート メソッドを統合テストで間接的にテストすることです。単体テストの要点は、実装を変更でき、テストは引き続き合格することです

于 2013-05-17T00:10:09.200 に答える