店内型号:
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
进行记录吗?
请注意,这在开发中有效||生产环境,只会在测试中出错。
谢谢。
答案 0 :(得分:0)
在只有一个属性,一个别名和一个具有相同默认值的工厂的基本模型上,我没有这种行为(使用RSpec,Factory Girl,Rails 5.1)。提供工厂的其余部分和模型将有所帮助。
要查找错误的来源,您可以:
alias_attribute
以外的整个Shop模型basic_token
以外的整个工厂create(:shop)
的虚拟测试通过了如果上述步骤3失败:
5.尝试更改别名的名称,看看您的应用程序中是否与名称token
冲突
6.尽可能尝试git bisect
来找到有罪的承诺。希望有帮助。