加速rspec控制器测试:在所有失败之前使用?

nat*_*vda 12 rspec ruby-on-rails rspec2

我有一个简单的控制器测试,包含以下代码:

context "POST :create" do
  before (:each) do
    post :create, :user_id => @user.id,
         :account => { .. some data ... }
  end
  it { response.status.should == 201 }
  it { response.location.should be_present }
end
Run Code Online (Sandbox Code Playgroud)

现在我想到了一种非常简单的方法来加速这个测试,并使用一个before(:all)而不是一个before(:each).在这种情况下,帖子只会做一次.

所以我写道:

context "POST :create" do
  before (:all) do
    post :create, :user_id => @user.id,
         :account => { .. some data ... }
  end
  it { response.status.should == 201 }
  it { response.location.should be_present }
end
Run Code Online (Sandbox Code Playgroud)

但后来我收到以下错误:

 RuntimeError:
   @routes is nil: make sure you set it in your test's setup method.
Run Code Online (Sandbox Code Playgroud)

这是设计的吗?有没有办法规避它?

nat*_*vda 12

我在rspec邮件列表上问了这个问题,得到了@dchelimsky自己的以下回复:

是.rspec-rails包含rails的测试框架,其中没有before(:all)概念,因此在每个示例之前重置所有数据.即使我们想在rspec-rails中支持这一点(我没有),也需要首先更改rails.

因此,在a中执行控制器调用是不可能的before(:all),它只能用于设置数据库或实例变量.