2012-12-26 50 views
0

無法使用RSpec從控制器測試變量值。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 

當我運行測試,我得到的各種誤差對assigns(:toy).user.should表明toy是零。我試過用很多方法搞亂assigns語法,因爲我找不到它的文檔。

我在做什麼錯?什麼是正確的方式來看看控制器用戶和玩具傳遞給它?

編輯:嘗試逐步過渡到實例變量,但它仍然沒有辦法。這裏又是我的代碼用實例變量(VAR不同的名字,相同的結果):

思路控制器:

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

回答

0

嘗試使用@toy代替控制器中的toy變量。 assigns只能訪問實例變量。

+0

試過了,但它不工作...請參閱重構上面的代碼(編輯我的問題) – ezuk

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中使用不正確的變量名稱。
+1

正要指出這一點。很高興你知道它。 :) – atmaish