2016-08-30 8 views
0

私はタスクで使った関数をテストする仕様を書こうとしていますが、この関数はjsonキーの名前を変更し、そのキーの古い値を保持する必要があります。update_allメソッドのrubyの仕様

とにかく私はそれを通過させることができません。

私の機能:

module Database 
    module JSONHelpers 
    def change_json_nested_key(klass, base_field, nested_key, from_key, to_key) 
     klass.where("#{base_field}->>'#{nested_key}' LIKE '%#{from_key}%'") 
      .update_all(
      "#{base_field} = jsonb_set(\ 
      #{base_field}::jsonb,\ 
       array['#{nested_key}'],\ 
       (#{base_field}->'#{nested_key}')::jsonb - '#{from_key}' ||\ 
       jsonb_build_object('#{to_key}', #{base_field}->'#{nested_key}'->'#{from_key}'))" 
      ) 
    end 
    end 
end 

と私のスペックは以下のとおりです。

let(:old_key) { 'drawings' } 
    let(:new_key) { 'picture' } 
    let(:boxes) { {"#{old_key}" => '4'} } 
    let(:move) { Move.create!(boxes: boxes)} 

    let(:klass) { Class.new { extend(Database::JSONHelpers) } } 
    subject { klass } 

    describe '::change_nested_json_key' do 
    before(:each) { subject.change_json_nested_key(Move, 'data', 'boxes', old_key, new_key) } 

機能は仕様の外で動作しますが、スペックではありません。 binding.pryは値が変更されていないことを示します。

何が間違っているのか、それとも何がルールなのですか?

+1

あなたの期待がありますを変更した後、あなたのインスタンスを更新するには?あなたは '移動 'をリロードするのを忘れましたか? –

答えて

2

使用(リロード)の値