コントローラーにプライベート メソッドがあります。データベースの更新に使用されます。このメソッドは、別のコントローラー メソッドから呼び出しています。そしてそれはうまくいきます。
しかし、そのメソッドのテストケースを作成しようとすると、関数内の (セッション変数とパラメーター) にアクセスするとトリップします。他のすべてのメソッドは正常に動作していますが、問題はプライベートメソッドのみですか?
機能テストのセットアップ方法では、セッションも設定しています。
コントローラーにプライベート メソッドがあります。データベースの更新に使用されます。このメソッドは、別のコントローラー メソッドから呼び出しています。そしてそれはうまくいきます。
しかし、そのメソッドのテストケースを作成しようとすると、関数内の (セッション変数とパラメーター) にアクセスするとトリップします。他のすべてのメソッドは正常に動作していますが、問題はプライベートメソッドのみですか?
機能テストのセットアップ方法では、セッションも設定しています。
private メソッドのテストは避けるべきです。public/private/protected メソッドを持つことの背後にある「目標」は、ロジックをカプセル化し、コードの一部を簡単に変更できるようにすることです。関数やクラスが他の関数とどのように相互作用するかを気にする必要はありません。
そうは言っても、まだプライベート メソッドをテストする必要があると感じている場合は、回避策があります。Jay Field のブログでこのユーティリティ関数を見つけました。
class Class
def publicize_methods
saved_private_instance_methods = self.private_instance_methods
self.class_eval { public *saved_private_instance_methods }
yield
self.class_eval { private *saved_private_instance_methods }
end
end
使用方法の詳細については、リンクを確認してください。やりたいことをすばやく簡単に実行できるようです。
ダメオン・ウィルソンの提案が好きです。私はあなたが「プライベートメソッドをテストすることを避けるべきである」という彼の声明の2番目です。必要に応じて、メソッドのパブリックバージョンを宣言します。
class FooTest < Test::Unit::TestCase
Foo.class_eval do
def public_bar(*args, &block)
private_bar(*args, &block)
end
end
def test_bar
assert_equal 42, Foo.new.public_bar
end
end
ラッピング メソッドを介してプライベート (保護された) メソッドにアクセスできるようにするサブクラスに対してテストするのはどうですか?
class Controller
protected
def your_private_method
...
end
end
class SubclassForTest < Controller
def testwrapper
your_private_method
end
end