我遇到了砖墙测试类重新定义,只是不知道如何处理它。这是我正在测试的场景(这不是核心数据):
- 应用程序使用版本 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
。
关于如何在规范示例的上下文中从头开始模拟创建此类的任何想法?