0

我在 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 工作人员):

 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
4

1 回答 1

0

虽然实际上并不是直接导致问题的事务性固定装置,但最终将它们关闭指出了问题所在。这实际上是我代码中的一个小错误。

交易中的生活很容易,直截了当,而且可能相当盲目。事情过去了,当他们可能不应该

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

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

我现在也意识到,人们应该对自己的能力更有信心,并相信已经编写的测试。在这种情况下,那个小小的错误可能会导致一些大问题。3天过得不错。

于 2012-11-20T23:16:33.157 回答