我遇到了在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
答案 0 :(得分:0)
虽然它实际上不是直接导致问题的事务性设备,但最终将它们关闭引发了问题。这实际上是我代码中的一个小错误。
交易中的生活很简单,直接且可能非常盲目。事情过去了,他们可能不应该
关闭它们意味着我需要废弃杂乱的种子并在需要时创建数据。
懒惰编码导致头痛和更多工作。
我现在也意识到,人们应该更加相信自己的能力,并相信已经写过的测试。在这种情况下,这个小小的bug可能会导致一些重大问题。花了3天时间。