Rails alias_attribute在RSPEC中不起作用

时间:2018-09-06 08:10:28

标签: ruby-on-rails ruby rspec factory-bot rspec-rails

店内型号:

class Shop < ActiveRecord::Base
  alias_attribute :token, :basic_token
  # basic_token column is set NOT to be NULL in DB
end

在商店工厂中:

FactoryGirl.define do
  factory :shop do
    basic_token '12313123123123123123123'
    ...
    ...
  end
end

在RSPEC商店控制器中:

require 'rails_helper'

RSpec.describe ShopsController, type: :controller do
  before do
    @shop = create(:shop) # FAILS

    => Failure/Error: @shop = create(:shop)
    => ActiveRecord::StatementInvalid:
    => PG::NotNullViolation: ERROR:  null value in column "basic_token" violates not-null constraint

  end

  describe "" do
     ........
  end
end

Rails控制台测试:

   WITH alias_attribute:
    (byebug) @shop = build(:shop)
    #<Shop remote_id: 1110212666, domain: "abc.myshopify.com", basic_token: nil, created_at: nil, updated_at: nil, ... >

    (byebug) @shop.valid?
    true

    (byebug) @shop.errors.messages
    {}

  WITH alias_attribute commented (# alias_attribute :token, :basic_token):
    (byebug) @shop = build(:shop)
    #<Shop remote_id: 1110212666, domain: "abc.myshopify.com", basic_token: "12313123123123123123123", created_at: nil, updated_at: nil, ... >

    (byebug) @shop.valid?
    true
    (byebug) @shop.errors.messages
    {}

评论alias_attribute :token, :basic_token,就可以了。

有人知道为什么我无法使用alias_attribute进行记录吗?

请注意,这在开发中有效||生产环境,只会在测试中出错。

谢谢。

1 个答案:

答案 0 :(得分:0)

在只有一个属性,一个别名和一个具有相同默认值的工厂的基本模型上,我没有这种行为(使用RSpec,Factory Girl,Rails 5.1)。提供工厂的其余部分和模型将有所帮助。

要查找错误的来源,您可以:

  1. 注释掉alias_attribute以外的整个Shop模型
  2. 注释掉basic_token以外的整个工厂
  3. 检查是否仅通过create(:shop)的虚拟测试通过了
  4. 取消注释批处理注释行,每次迭代运行测试。

如果上述步骤3失败:   5.尝试更改别名的名称,看看您的应用程序中是否与名称token冲突   6.尽可能尝试git bisect来找到有罪的承诺。希望有帮助。