如何使rspec获取属性的默认值,在模型的模式中设置

时间:2014-09-16 12:25:09

标签: ruby-on-rails activerecord rspec migration

在迁移中为列设置默认值时,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'欺骗甚至整个宝石来设置默认值,但迁移中的默认设置对我来说似乎是最干净的。不过,我还想测试一下。

1 个答案:

答案 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

创建任何新的模型实例