在迁移中为列设置默认值时,Rails会很好地选择它:
def change
add_column :account, :role, :string, default: 'mother'
Account.update_all(role: 'mother')
end
访问例如rails console按预期工作:
Account.new.role #=> 'mother'
但是,出于某种原因,不是在rspec规范中:
expect(Account.new.role).to equal 'mother' #fail
expect(Account.new.role).to not_be_nil #fail
我可以想象rspec模型规范试图避免加载模式,因此对属性的默认值一无所知。我不确定这是否是原因。
是否有一些设置,魔术或其他调用可以让我测试此类默认值的行为。
注意:我知道' after_initialize'欺骗甚至整个宝石来设置默认值,但迁移中的默认设置对我来说似乎是最干净的。不过,我还想测试一下。
答案 0 :(得分:1)
您无法在数据库中保留符号。 Rails自动转换数字&字符串列中的符号通过调用它们上的#to_s。
如果要接收数据库列的符号,则应覆盖模型中的方法,如下所示:
def role
read_attribute(:role).try(:to_sym)
end
修改强>
您是否为测试环境运行迁移? RAILS_ENV = test rake db:schema:load或rake db:test:prepare。 RSpec加载整个模式,否则您将无法使用ActiveRecord
创建任何新的模型实例