【问题标题】:cannot access flash[:error] defined in controller method from rspec test无法从 rspec 测试访问控制器方法中定义的 flash[:error]
【发布时间】:2012-12-08 04:38:13
【问题描述】:

我是 Rails 和 rspec 的新手。我的控制器中有一个自定义方法,它不是一个动作。我正在尝试使用规范测试此方法。

这是我的控制器方法:

def find_target_by_id(target_id)    
    begin
      @target = Target.find(target_id)
    rescue ActiveRecord::RecordNotFound
      flash[:error] = "Target with Id #{target_id} does not exist."
      redirect_to root_url
    end
end

这是我对此方法的 rspec 测试:

context "is given invalid id" do
   before do
     Target.stub(:find).with("1").and_raise(ActiveRecord::RecordNotFound)
   end
   it "returns flash[:error] " do
     TargetsController.new.find_target_by_id("1")
     flash[:error].should eq("Target with Id 1 does not exist.")
   end

   it "redirects to root url " do
      TargetsController.new.find_target_by_id("1")
      response.should redirect_to(root_url)
   end
end

但是,在运行测试时,我得到了错误:

Failure/Error: TargetsController.new.find_target_by_id("1").should have(flash[:error])
 RuntimeError:
   ActionController::Base#flash delegated to request.flash, but request is nil: #<TargetsController:0x007fced708ae50 @_routes=nil, @_action_has_layout=true, @_headers={"Content-Type"=>"text/html"}, @_status=200, @_request=nil, @_response=nil>
 # ./app/controllers/targets_controller.rb:71:in `find_target_by_id'
 # ./spec/controllers/targets_controller_spec.rb:212:in `block (4 levels) in <top (required)>'

非常感谢任何帮助。

【问题讨论】:

  • 您是否找到了一种在 Rails 控制器中测试非动作方法的好方法?

标签: ruby-on-rails rspec


【解决方案1】:

除非发出了实际的 Web 请求,否则您无法访问 Rspec 中的闪存。这就是错误所暗示的 - 它正在查看 request.flash,但 request 为 nil,因为您尚未发出 Web 请求。

一些想法:

  • 在您的测试中向调用此方法的操作发出 GET(或 POST 或其他)请求,以便您实际上可以访问闪存
  • 不要在辅助方法中设置 flash,而是返回错误消息或引发异常并将 flash 消息设置留给控制器操作

如果我遇到这种情况,我会采取第二种方法。将控制的东西(比如设置闪光灯和诸如此类的东西)留给控制器动作,并保持你的帮助方法简单明了。它肯定会帮助您简化测试。

【讨论】:

  • 感谢 BaronVonBraun 的快速回复。我现在看到了。我在这个辅助方法中设置 flash 的原因是因为它被控制器中的多个操作调用。因此,如果我将错误设置为控制器操作,我的代码中就会有很多冗余。我很困惑...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多