2

Rails からテストを切り離すのに問題があります。たとえば、current_user以下のヘルパーで呼び出されるメソッド (Devise から) をスタブする方法は?

ヘルパー モジュール:

module UsersOmniauthCallbacksHelper

  def socialmedia_name(account)
    name = current_user.send(account)['info']['name']
    name = current_user.name if name.blank?
    name
  end

end

テスト

require_relative '../../app/helpers/users_omniauth_callbacks_helper.rb'

describe 'UsersOmniauthCallbacksHelper' do
  include UsersOmniauthCallbacksHelper

  describe '#socialmedia_name(account)' do
    it 'should return the users name listed by the social media provider when that name is provided' do

      #once I've done away spec_helper, this next line ain't gonna fly.
      helper.stub(:current_user) { FactoryGirl.create(:user, facebook:  {"info"=>{"name"=>"Mark Zuckerberg"}}) }

      socialmedia_name('facebook').should == "Mark Zuckerberg"
    end
  end
end

current_userクラスで使用されるメソッドをスタブするにはどうすればよいですか?

Rails をロードしていた場合でも、テストでhelper.stub(:current_user). しかし、spec_helper ファイルを読み込んでいないので、当然のことながら、これは機能しません。

4

2 に答える 2

2

モジュールをテストする場合、ヘルパーをテスト クラスに含め、新しいインスタンスを作成し、そこからメソッドをスタブするのが最善の選択です。さらに、より多くの名前ロジックをモデルに移動する必要があります。これにより、ヘルパーが について知る必要がなくなり、send(account)その戻り値がハッシュ (デメテルの法則) を持つハッシュになります。ほとんどすべての socialmedia_name メソッドをモデルに含めたいと思います。例えば:

describe 'UsersOmniauthCallbacksHelper' do
  let(:helper) do
    Class.new do
      include UsersOmniauthCallbacksHelper
      attr_accessor :current_user
    end.new
  end
  let(:user) { stub('user') }

  before do
    helper.current_user = user
  end

  describe '#socialmedia_name(account)' do
    it 'should return the users name listed by the social media provider when that name is provided' do
      # stub user here

      helper.socialmedia_name('facebook').should == "Mark Zuckerberg"
    end
  end
end
于 2013-01-26T18:05:12.330 に答える
0

これが私が最終的に得たものです(ジムの推奨に従ってコードをリファクタリングする前)。最も重要なことは、テストが信じられないほど迅速に実行されることです。このヘルパーは変更される可能性がありますが、私はこのレールレス戦略をより多くの作業で使用する予定です。

#spec/helpers/users_omniauth_callbacks_helper_spec.rb

require_relative '../../app/helpers/users_omniauth_callbacks_helper.rb'
require 'active_support/core_ext/string'

describe 'UsersOmniauthCallbacksHelper' do
  let(:helper) do
    Class.new do
      include UsersOmniauthCallbacksHelper
      attr_accessor :current_user
    end.new
  end

  describe '#socialmedia_name(account)' do
    it 'should return the users name listed by the social media provider when that name is provided' do
      helper.current_user = stub("user", :facebook =>{"info"=>{"name"=>"Mark Zuckerberg"}}) 
      helper.socialmedia_name('facebook').should == "Mark Zuckerberg"
    end

    it 'should return the current users name when the social media data does not provide a name' do
     helper.current_user = stub("user", name: "Theodore Kisiel", facebook: {"info"=>{}}) 
      helper.socialmedia_name('facebook').should == "Theodore Kisiel"
    end
  end
end
于 2013-01-28T14:38:40.313 に答える