最近、Ruby on Rails プロジェクトを rspec-core / rspec-rails 2.10.1 から 2.14 にアップグレードしました。現在 (私が恐れていたように) 多くのテストが失敗していますが、それは単にいくつかのメソッドが変更されたからです。私はすでに非推奨 (スタブ! -> スタブ、モック -> ダブル) を修正しましたが、さらにいくつかあります。私がどこでも使用している重要な方法の 1 つは、ここで取り上げたものです: https://www.ruby-forum.com/topic/126993関連付けメソッドをスタブ化する:
module RSpec
module Mocks
module Mock
def stub_association!(association_name, methods_to_be_stubbed = {})
mock_association = RSpec::Mocks::Mock.new(association_name.to_s)
methods_to_be_stubbed.each do |method, return_value|
mock_association.stub(method).and_return(return_value)
end
self.stub(association_name).and_return(mock_association)
end
end
end
end
これにより、次のエラー メッセージがスローされます。
Failure/Error: @foo.stub_association!(:children, :sorted => [])
Double "Foo_1910" received unexpected message :stub_association! with (:children, {:sorted=>[]})
上記のモジュール名が変更されていると思いますが、どのように正確かわかりませんでした。ヒントをいただければ幸いです。
次に、次のようなコードを使用してコントローラー メソッドをスタブ化しました。
112) ApplicationHelper admin_link_to not logged in: should output nothing
Failure/Error: stub(:authenticate_with_http_basic).and_return nil
Stub :authenticate_with_http_basic received unexpected message :and_return with (nil)
コントローラーメソッドはこれです
def admin_link_to(...)
return link_to(...) if logged_in? and current_user.has_role?(:admin)
end
とlogged_in?
呼び出しますauthenticate_with_http_basic do |login, password| ...
。同様にrequest
、テスト対象のコントローラーまたはヘルパーに偽の要求オブジェクトを提供するためにスタブを使用していました。
rspec-rails 2.14でこれを行うにはどうすればよいですか?
アップデート
(上記の呼び出しに必要な)Mock
への名前変更とは別に、テスト対象に応じて、呼び出しの前にまたは置く必要があったようです。そうTestDouble
stub_association!
controller
helper
stub(...)
stub(:authenticate_with_http_basic).and_return nil
になる
helper.stub(:authenticate_with_http_basic).and_return nil
ほとんどの場合、これで問題なく動作します。ただし、名前を変更Mock
することTestDouble
はケーキの半分に過ぎませんでした-私はまだstub_association!
実際のオブジェクトで私のメソッドを使用することはできず、モック(または現在呼び出されているようにダブル)でのみ使用できます。
だから私はそこに80%います。最後の 20% を獲得した人はいますか? :)