2012-12-26 29 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