测试自定义后期操作事务问题

时间:2012-11-12 15:43:12

标签: ruby-on-rails ruby-on-rails-3 rspec

我遇到了在Rails 3.2.8应用程序中测试自定义帖子操作的问题。我认为它与事务性灯具设置为真有关,但可以通过一些帮助诊断。

我的spec_helper.rb

中有这个
config.use_transactional_fixtures = true

我的控制器规格看起来像这样:

require 'spec_helper'   
describe Api::V1::NasController do       
  login_user        
  describe "GET #nas" do      
    it "posts to startup as new (state) controller" do
      @location = FactoryGirl.create(:location_full)
      @location.users << @current_user
      nas = FactoryGirl.create(:nas, location_id: @location.id )   
      nas.update_attributes!(:state => 'initialised')
      post :start_up, :token => nas.token, :key => nas.key
      response.should be_success
    end   
  end   
end

我可以在我的服务器日志中看到发布的帖子但是测试失败了:

   1) Api::V1::NasController GET #nas posts to startup as new (state) controller
 Failure/Error: post :start_up, :token => @nas.token, :key => @nas.key
 NoMethodError:
   undefined method `slice' for nil:NilClass
 # ./app/helpers/nas_helper.rb:26:in `queue'
 # ./app/controllers/api/v1/nas_controller.rb:99:in `start_up'
 # ./spec/controllers/api/v1/nas_controller_spec.rb:16:in `block (3 levels) in <top (required)>'

我的控制器中有一个前置过滤器,它接受令牌和密钥,如果无法找到Nas,则会对头部进行授权。

在这个测试中,实际上找到了Nas并且它进入了控制器动作:

def start_up
   @token = params[:token]
   @nas = Nas.find_by_token("#{@token}")
   if @nas
   [ do some stuff ]
   ....
   NasSync.enqueue(@nas)   
   ...       
end

它在NasSync.enqueue(@nas)失败了,后者又调用了以下的帮助方法(来自我省略的resque worker):

 def self.queue(nas)  
   node = Nas.find(nas.id).nasname.slice(0..3)
   .....
 end

在“真实”世界中,我可以成功发布到此网址 - 它只是在测试环境中失败。

 node = Nas.find(nas.id).nasname.slice(0..3)

没有找到Nas来切片。

我无法弄清楚为什么它找不到Nas,如果它到目前为止没有失败。如果我对节点进行硬编码,则测试通过。

是否有一个特定的原因导致没有将nas发送给帮助者?

任何建议/帮助表示感谢。

- 更新 -

我已经关闭了事务性灯具,对剩下的混乱进行了排序,但仍然遇到错误:

 undefined method `slice' for nil:NilClass

1 个答案:

答案 0 :(得分:0)

虽然它实际上不是直接导致问题的事务性设备,但最终将它们关闭引发了问题。这实际上是我代码中的一个小错误。

交易中的生活很简单,直接且可能非常盲目。事情过去了,他们可能不应该

关闭它们意味着我需要废弃杂乱的种子并在需要时创建数据。

懒惰编码导致头痛和更多工作。

我现在也意识到,人们应该更加相信自己的能力,并相信已经写过的测试。在这种情况下,这个小小的bug可能会导致一些重大问题。花了3天时间。