使用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
。
答案 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
我的错误:
assigns
。assigns
。答案 1 :(得分:0)
尝试使用toy
替换Controller中的@toy
变量。 assigns
只能访问实例变量。