0

RSpec を使用してコントローラから変数値をテストする際に問題が発生しました。

関連するコントローラ コード:

class ToysController < ApplicationController

  def claim
    toy = Toy.find(params[:toy_id])
    current_user.toys << toy
    toy.status = "claimed"
    render :index
  end

end

これは間違いなくうまくいきputs toy.inspectます。しかし、私はそれをテストすることはできません。多くの面倒な試行の後、現在のテストは次のようになります。

require 'spec_helper'

describe ToysController do

  describe "GET 'claim'" do
    let(:james) {create(:user)}
    let(:toy) {create(:toy)}

    before do
      OmniAuth.config.mock_auth[:google] = {
          uid: james.uid
      }
      session[:user_id] = james.id
    end

    it "can be claimed by a user" do
      get :claim, toy_id: toy.id
      assigns(:toy).user.should eq james.id
    end

  end

end

テストを実行すると、それが Nilでassigns(:toy).user.shouldあることを示すさまざまなエラーが表示されます。ドキュメントが見つからなかったため、さまざまな方法で構文をtoyいじってみました。assigns

私は何を間違っていますか?コントローラーがユーザーとそれに渡されたおもちゃに対して何をするかを確認する正しい方法は何ですか?

編集:インスタンス変数に段階的に移行しようとしていますが、それでもうまくいきません。インスタンス変数を使用したコードを次に示します (変数名は異なりますが、結果は同じです)。

アイデア コントローラ:

def claim
  @idea = Idea.find(params[:idea_id])
  current_user.ideas << @idea
  @idea.status = "claimed"
  render :index
end

テスト:

describe "GET 'claim'" do
  let(:james) {create(:user)}
  let(:si_title) {create(:idea)}

  before do
    OmniAuth.config.mock_auth[:google] = {
        uid: james.uid
    }
    session[:user_id] = james.id
  end

  it "can be claimed by a user" do
    get :claim, idea_id: si_title.id
    puts assigns(si_title).inspect

  end
end

出力: nil.

4

2 に答える 2

1

解決しました!テストは次のようになります。

describe "GET #claim" do
  let(:james) {create(:user)}
  let(:si_title) {create(:idea)}

  before do
    OmniAuth.config.mock_auth[:google] = {
        uid: james.uid
    }
    session[:user_id] = james.id
  end

  it "can be claimed by a user" do
    get :claim, idea_id: si_title.id
    assigns(:idea).user_id.should eq james.id
  end

end

私の間違い:

  1. のインスタンス変数名のプレフィックスにコロンを使用しないassigns
  2. で誤った変数名を使用していますassigns
于 2012-12-26T16:58:13.797 に答える
0

toyController の variable を に置き換えてみてください@toyassignsインスタンス変数にのみアクセスできます。

于 2012-12-26T16:44:05.483 に答える