使用RSpec测试控制器:无法读取变量

时间:2012-12-26 16:36:04

标签: ruby-on-rails model-view-controller rspec controllers

使用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

2 个答案:

答案 0 :(得分: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. 中为实例变量名称添加前缀
  3. assigns
  4. 中使用不正确的变量名称

答案 1 :(得分:0)

尝试使用toy替换Controller中的@toy变量。 assigns只能访问实例变量。