Rails 3.2.8 アプリケーションでカスタム投稿アクションをテストする際に問題が発生しています。トランザクションフィクスチャがtrueに設定されていることと関係があると思いますが、診断に役立つ可能性があります。
これは私の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
「現実の」世界では、この URL に正常に投稿できます。失敗するのはテスト環境だけです。
node = Nas.find(nas.id).nasname.slice(0..3)
スライスする Nas が見つかりません。
Nas が見つからない理由がわかりません。ノードをハードコーディングすると、テストに合格します。
NAS がヘルパーに送信されない特定の理由はありますか??
任意の提案/ヘルプをいただければ幸いです。
- アップデート -
トランザクションフィクスチャをオフにし、残った混乱をソートしましたが、まだエラーが発生しています:
undefined method `slice' for nil:NilClass