【发布时间】: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