【发布时间】:2014-07-22 23:20:06
【问题描述】:
我是 Rspec 的新手,我正在尝试进入整个 BDD 思维模式,所以我对这个错误感到非常困惑。我有我正在尝试测试的 Rails 引擎。这是公告控制器。基本上在任何操作之前我想填充课程列表。
class BulletinsController < ApplicationController
before_filter :get_courses
def new
@bulletin = Bulletin.new(author_id: @user.id)
end
...
private
def get_courses
if @user.has_role? :admin
@course_list = Course.all.sort_by(&:start_date)
...
end
end
应用程序控制器有一些我想在每个请求上运行的方法。我在主机应用程序中使用设计,所以我可以访问 current_user 方法
class ApplicationController < ::ApplicationController
before_filter :get_user
...
def get_user
@user = current_user
end
...
end
这是我要运行的规范:
describe BulletinsController do
routes { MyEngine::Engine.routes }
before { controller.stub(:authenticate_user!).and_return true }
before { controller.stub(:get_user).and_return (@user = create(:user)) }
describe "GET #new" do
it "assigns a new bulletin to @bulletin" do
bulletin = create(:bulletin)
controller.stub(:get_courses)
get :new
assigns(:bulletin).should eq(bulletin)
end
end
end
当我尝试运行规范时,我收到错误:
NoMethodError: undefined method 'id' for nil:NilClass
我知道我收到此消息是因为在公告大楼中调用 @user 时未定义它;但是我认为规范中的 before 块将在删除 :get_user 过滤器后定义 @user 变量。当我在控制台中测试工厂时,一切似乎都是通过适当的关联创建的(公告 -> 作者、公告 -> 课程等)。
我不确定我为什么没有将@user 变量传递到我的控制器代码中。非常感谢任何有关 rspec 的见解和/或好的教程。
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-4 rspec bdd