在使用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
我的错误:
- 没有在
assigns
中使用冒号作为实例变量名的前缀。 -
assigns
. 使用错误的变量名
尝试用@toy
替换控制器中的toy
变量。assigns
只能访问实例变量