Ruby on rails 无法从rspec测试访问控制器方法中定义的闪存[:错误]

Ruby on rails 无法从rspec测试访问控制器方法中定义的闪存[:错误],ruby-on-rails,rspec,Ruby On Rails,Rspec,我是rails和rspec的新手。我的控制器中有一个自定义方法,它不是一个动作。我正在尝试使用spec测试这个方法 以下是我的控制器方法: def find_target_by_id(target_id) begin @target = Target.find(target_id) rescue ActiveRecord::RecordNotFound flash[:error] = "Target with Id #{target_id} doe

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

以下是我的控制器方法:

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)>'
失败/错误:TargetsController.new.find_target_by_id(“1”)。应该有(flash[:Error])
运行时错误:
ActionController::Base#flash委托给request.flash,但请求为nil:#“text/html”},@#u status=200,@#u request=nil,@#u response=nil>
#./app/controllers/targets\u controller.rb:71:in'find\u target\u by\u id'
#./spec/controllers/targets\u controllers\u spec.rb:212:in'block(4层)in'

非常感谢您的帮助。

除非您提出了实际的web请求,否则您无法在Rspec中访问flash。这就是错误所暗示的-它正在查看
request.flash
,但是
request
为零,因为您没有进行web请求

一些想法:

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

如果我是在这种情况下,我会采取第二种方法。将controllery的东西(比如设置flash和诸如此类的东西)留给控制器操作,并保持助手方法简单明了。它肯定会帮助您简化测试。

除非发出实际的web请求,否则您无法在Rspec中访问flash。这就是错误所暗示的-它正在查看
request.flash
,但是
request
为零,因为您没有进行web请求

一些想法:

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

如果我是在这种情况下,我会采取第二种方法。将controllery的东西(比如设置flash和诸如此类的东西)留给控制器操作,并保持助手方法简单明了。这肯定有助于简化您的测试。

感谢BaronVonBraun的快速回复。我现在看到了。我在这个助手方法中设置flash的原因是因为控制器中的多个操作正在调用它。因此,如果我将错误设置为控制器操作,我的代码中将有大量冗余。我很困惑…谢谢巴伦文布朗男爵的快速回复。我现在看到了。我在这个助手方法中设置flash的原因是因为控制器中的多个操作正在调用它。因此,如果我将错误设置为控制器操作,我的代码中将有大量冗余。我很困惑……您是否找到了在Rails控制器中测试非操作方法的好方法?您是否找到了在Rails控制器中测试非操作方法的好方法?