Ruby on Rails - 使用 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是Nil。我试过用很多方法弄乱assigns语法,因为我找不到它的文档。

我做错了什么?怎样才能正确地看到控制器对用户和传递给它的玩具做了什么?

Edit:尝试过渡到实例变量,但它仍然没有做到这一点。下面是我的代码再次与实例变量(不同的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 .

解决!测试现在是这样的:

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 .
  3. 使用错误的变量名

尝试用@toy替换控制器中的toy变量。assigns只能访问实例变量

相关内容

  • 没有找到相关文章

最新更新