我在 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