【问题标题】:How to make rspec pick up defaults for attributes, set in the schema of a Model如何使 rspec 为属性选择默认值,在模型的模式中设置
【发布时间】:2014-09-16 12:25:08
【问题描述】:

在迁移中为列设置默认值时,Rails 可以很好地选择:

def change
  add_column :account, :role, :string, default: 'mother'
  Account.update_all(role: 'mother')
end

在例如访问这个rails 控制台按预期工作:

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”技巧甚至整个 gem 都可以设置默认值,但是迁移中的这种默认设置对我来说似乎是最干净的。不过,我想测试一下。

【问题讨论】:

  • 您是否为测试环境运行过迁移? RAILS_ENV=test rake db:schema:load 或 rake db:test:prepare。 RSpec 加载整个模式,否则您将无法使用 ActiveRecord 创建任何新的模型实例
  • 哦。在 minitest/rails4 项目上工作了一段时间,这让我对 Rails 管理我的测试数据库感到非常自在。单独迁移测试可以解决问题。你能把它变成一个答案让我接受吗?
  • 对我的回复进行了编辑

标签: ruby-on-rails activerecord rspec migration


【解决方案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 创建任何新的模型实例

【讨论】:

  • 你是对的,但这不是真正的问题。我将更新我的问题以指出该值根本没有在 rspec 中设置,而是在其他任何地方使用 Account.new 设置。
猜你喜欢
  • 2013-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-17
  • 1970-01-01
  • 2017-02-16
  • 2017-05-02
相关资源
最近更新 更多