1

私は Rspec が初めてで、RoR もかなり初めてです。そうは言っても、これを機能させるためにすべてのオプションを使い果たしました。Usercreateアクションでを作成するメソッドに変数がありますUserController.rb。この変数は、認証方法からデータを取得します。次に、API 呼び出しからの応答であるこのローカル変数を使用して、変数パラメーターに従ってユーザーを作成します。私は Rspec の知識の範囲内ですべてを試しましたが、運がなければそれほど多くはありません。メソッドと変数をスタブ/モックするため、データ変数が nil であるため、エラーが発生し続けます。

誰かがこれをテストする方法を理解するのを手伝ってくれたり、これを行う方法に関する優れたチュートリアル (私はたくさん読んだ) にリンクしてくれたりしたら、本当に感謝しています。

これが私のコードです:

users_controller.rb

def get_google_data
  ...
  data = response.parsed #OAuth2 

  @id = data['id']
  @email = data['email']
  @fname = data['given_name']
  @lname = data['family_name']
end

def create
  get_google_data
  puts "Got google data"
  puts @id
  if !@id.nil?
    puts "data is not nil"
    @user = User.find_by_google_id(@id)
    puts @user

    if @user.nil?
      puts "inside user condition"
      @user = User.new(:email => @email, :google_id => @id,
                       :first_name => @fname,
                       :last_name => @lname)

      if @user.save
        render json: @user, status: :created, location: @user
      else
        render json: @user.errors, status: :unprocessable_entity
      end
    else
      puts "ended in the right Place"
      render json: @user, location: @user
    end
  end
end

users_controller_spec.rb

describe "should not create duplicate user" do
  it "returns user object that was previously created" do
    @user = mock_model(User, :google_id=>1)
    #controller.should_receive(:get_google_data).and_return(:true)
    controller.instance_variable_set(:@id, 1)
    User.stub!(:find_by_google_id).with(1).and_return(@user)

    post :create
    @user.should_not be_nil
  end
end

2つの問題があります。

  1. data['id']および次の割り当てのデータを制御できないため、テストは失敗します。

    Failure/Error: post :create
     NoMethodError:
       undefined method `[]' for nil:NilClass
     # ./app/controllers/users_controller.rb:109:in `get_google_data'
     # ./app/controllers/users_controller.rb:118:in `create'
     # ./spec/controllers/users_controller_spec.rb:6:in `block (3 levels) in <top (required)>'
    
  2. return を呼び出すと@user、循環参照エラーが発生します。

    2) UsersController should not create duplicate user returns user object that was previously created
     Failure/Error: post :create
     ActiveSupport::JSON::Encoding::CircularReferenceError:
       object references itself
     # ./app/controllers/users_controller.rb:141:in `create'
     # ./spec/controllers/users_controller_spec.rb:24:in `block (3 levels) in <top (required)>'
    
4

0 に答える 0