Rails alias_attribute не работает в RSPEC - PullRequest
0 голосов
/ 06 сентября 2018

В магазине Модель:

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 голосов
/ 06 сентября 2018

На базовой модели с одним атрибутом, одним псевдонимом и фабрикой с таким же значением по умолчанию я не получаю такого поведения (с RSpec, Factory Girl, Rails 5.1). Предоставление остальной части фабрики и модели поможет.

Чтобы узнать источник ошибки, вы можете:

  1. Закомментируйте всю модель магазина, кроме alias_attribute
  2. Закомментируйте всю фабрику, кроме basic_token
  3. Убедитесь, что фиктивный тест, который просто выполняет create(:shop), проходит
  4. Раскомментируйте закомментированные строки в пакетном режиме, выполняя тест каждую итерацию.

Если вышеуказанный шаг 3 не выполнен: 5. Попробуйте изменить имя псевдонима, посмотрите, не конфликтует ли что-нибудь в вашем приложении с именем token 6. Постарайтесь git bisect как можно дальше, чтобы найти виновного. Надеюсь, это поможет.

...