【问题标题】:Testing controllers with RSpec: Can't read variables使用 RSpec 测试控制器:无法读取变量
【发布时间】:2012-12-26 16:36:04
【问题描述】:

无法使用 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 为 Nil。我已经尝试以多种方式弄乱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

【问题讨论】:

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


    【解决方案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 中使用了不正确的变量名。

    【讨论】:

      【解决方案2】:

      尝试将 Controller 中的 toy 变量替换为 @toyassigns 只能访问实例变量。

      【讨论】:

      • 试过了,但它不起作用...请参阅上面的重构代码(编辑我的问题)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多