【问题标题】:Rspec testing model with null: false constraint带有 null: false 约束的 Rspec 测试模型
【发布时间】:2017-10-19 17:32:59
【问题描述】:

我对在某些属性上使用 null: false 测试 (Rspec) 模型感到困惑:

当使用其中一个属性 = nil 创建一个新实例时,新的 instance.valid?返回 true 但如果我尝试保存它,它会在 ActiveRecord::NotNullViolation 上返回错误消息。我知道它通过了“模型验证”但在“数据库验证”中失败了。 那么测试我的模型的正确方法是什么?

RSpec.describe BusinessSetting, type: :model do
  # before :each do
  #   @business_setting = FactoryGirl.create(:business_setting)
  # end

  it "has a valid factory" do
    expect(FactoryGirl.create(:business_setting)).to be_valid
  end

  it "is invalid without a business_id" do
    expect(FactoryGirl.create(:business_setting, business_id: 
nil)).not_to be_valid
  end 

  it "is invalid without a bot_token" do
    expect(FactoryGirl.build(:business_setting, bot_token: nil)).to 
raise_error
  end  
end

Failures:

  1) BusinessSetting is invalid without a business_id

Failure/Error: expect(FactoryGirl.create(:business_setting, business_id: nil)).to raise_error

 ActiveRecord::NotNullViolation:
   Mysql2::Error: Field 'business_id' doesn't have a default value: INSERT INTO `business_settings` (`bot_token`, `employee_user_id`, `created_at`, `updated_at`, `bill_regex`, `email`, `store_code`, `name`, `description`) VALUES ('516dbe4b-9a54-47e7-be7f-9110703589e6', 25899, '2017-10-19 17:42:18', '2017-10-19 17:42:18', '^F947\\d{7}$', 'email@magasin.com', '947', 'Nom du magasin', 'Description du magasin')
 # ./spec/models/business_setting_spec.rb:14:in `block (2 levels) in <top (required)>'
 # ------------------
 # --- Caused by: ---
 # Mysql2::Error:
 #   Field 'business_id' doesn't have a default value
 #   ./spec/models/business_setting_spec.rb:14:in `block (2 levels) in <top (required)>'

  2) BusinessSetting is invalid without a bot_token

Failure/Error: expect(FactoryGirl.build(:business_setting, bot_token: nil)).to raise_error
       expected Exception but was not given a block
 # ./spec/models/business_setting_spec.rb:18:in `block (2 levels) in <top (required)>'

【问题讨论】:

  • 您的假设是正确的,您可以测试它是否引发了所述异常。最终,您希望向模型添加验证,因此验证失败并保存返回 false,而不是引发数据库异常。
  • 谢谢雷托。使用 FactoryGirl.build 它不会引发任何错误,因为它不处理数据库(我猜)。使用 FactoryGirl.create,raise_error 没有得到回答,因为 NotNullViolation 之前引发了。

标签: ruby-on-rails ruby testing rspec


【解决方案1】:

expect to raise_error 应与 {}

一起使用
expect{FactoryGirl.create(:business_setting, business_id: nil)}.to raise_error

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多