2016-01-27 3 views
0

У меня есть одна модель пользователя, которая имеет разные проверки, основанные на переменной окружения ENV ['APP_FOR']. Это может быть «app-1» или «app-2». Приложение-1 проверяет имя пользователя, а приложение-2 проверяет адрес электронной почты. Вот моя модель пользователя спецификации для приложения-1:Попытка изменить переменную среды в спецификации спецификации RSpec

require 'rails_helper' 

RSpec.describe User, type: :model do 

    include Shared::Categories 

    before do 
    ENV['APP_FOR']='app-1' 
    end 

    context "given a valid User" do 
    before { allow_any_instance_of(User).to receive(:older_than_18?).and_return(true) } 

    it {should validate_presence_of :username} 
    end 
end 

И это модель пользователя спецификации для приложения-2

require 'rails_helper' 

RSpec.describe User, type: :model do 

    include Shared::Categories 

    before do 
    ENV['APP_FOR']='app-2' 
    end 

    context "given a valid User" do 
    before { allow_any_instance_of(User).to receive(:older_than_18?).and_return(true) } 

    it {should validate_presence_of :email} 
    end 
end 

Моя проблема заключается в том, что переменная окружения не установлена, как я ожидал бы, что он будет в переднем блоке. Есть идеи, как это сделать?

EDIT 1

Вот моя реализация проверки. Я использовал беспокойство, которое я расширить пользовательскую модель с:

module TopDogCore::Concerns::UserValidations 
    extend ActiveSupport::Concern 
    included do 

    if ENV['APP_FOR'] == 'app-1' 
     validates :username, 
       presence: true, 
       uniqueness: true   

    elsif ENV['APP_FOR'] == 'app-2' 
     validates :email, 
       presence: true, 
       uniqueness: true 
    end 
    end 
end 
+0

Вы могли бы опубликовать свою проверку? –

+0

@IgorBelo проверить новое редактирование выше, я включил его там – NdaJunior

ответ

1

Попробуйте

module TopDogCore::Concerns::UserValidations 
    extend ActiveSupport::Concern 
    included do 

    validates :username, 
     presence: true, 
     uniqueness: true, if: -> { ENV['APP_FOR'] == 'app-1' } 

    validates :email, 
     presence: true, 
     uniqueness: true, if: -> { ENV['APP_FOR'] == 'app-2' } 
    end 
end 
+0

Спасибо, но это не сработало :-( – NdaJunior

+0

Исправление, это сработало !! Спасибо! Заверяем мои валидации работами лямбды! – NdaJunior

1

RSpec грузы класс субъекта перед запуском кода в примерах. Когда вы это сделаете:

before do 
    ENV['APP_FOR'] = # ... 
end 

Слишком поздно. Определение класса уже выполнено. Вы можете убедиться в этом сами, просто распечатав значение ENV['APP_FOR'] из определения класса (в вашем случае включенная проблема). Это nil, так как переменная окружения не была установлена ​​при загрузке исходного файла класса.

Отклонение оценки с помощью лямбда (as suggested here) должно работать. Вы можете попытаться использовать свой собственный тест вместо того, который был предоставлен shoulda_matchers, например .:

expect(subject.valid?).to be false 
expect(subject.errors[:username].blank?).to be false 
Смежные вопросы