クラスの再定義をテストするレンガの壁にぶつかっていますが、それにアプローチする方法がわかりません。私がテストしているシナリオは次のとおりです (これは Core Data ではありません)。
- アプリケーションはバージョン 1 のモデルで実行されます
- 熱心なプログラマーは、列を追加/削除/再定義してモデルを変更します
- アプリケーションはバージョン 2 のモデルで実行されます
私が問題に直面しているのは、メモリからのアプリケーションの実際の削除と、最初からの再構築をシミュレートすることです。モジュールがインクルードされると、多くのモデル固有の設定が行われ、MotionModel::Model
モジュールがクラスにインクルードされるときに一度だけ行われるため、これは重要です。これが私がうまくいくと感じたものです:
it "column removal" do
class Removeable
include MotionModel::Model
columns :name => :string, :desc => :string
end
@foo = Removeable.create(:name=> 'Bob', :desc => 'who cares anyway?')
Removeable.serialize_to_file('test.dat')
@foo.should.respond_to :desc
Object.send(:remove_const, :Removeable) # Should remove all traces of Removeable
class Removeable
include MotionModel::model # Should include this again instead
columns :name => :string, # of just reopening the old Removeable
:address => :string # class
end
Removeable.deserialize_from_file # Deserialize old data into new model
Removeable.length.should == 1
@bar = Removeable.first
@bar.should.respond_to :name
@bar.should.respond_to :address
@bar.should.not.respond_to :desc
@bar.name.should == 'Bob'
@bar.address.should == nil
end
end
残念ながら、Object.send(:remove_const, :Removeable)
私が望んでいたことはしません。Rubyは、モジュールのメソッドを再度開いRemoveable
ても実行できないと考えているだけです。self.included()
MotionModel::Model
仕様例のコンテキストで、このクラスの作成をゼロからエミュレートする方法に関するアイデアはありますか?