Создайте несколько фабрик для пользователя - PullRequest
0 голосов
/ 09 мая 2018

Раньше у меня была единая фабрика для пользователя, и она работала нормально.

Но теперь я хочу два набора фабрик для пользовательских данных, один с зашифрованными данными, а другой с обычными текстовыми данными пользователя.

Это код, который я использую:

FactoryBot.define do
  factory :user do
   trait :encryption do 
    email                 AESCrypt.encrypt(Faker::Internet.email, ENV["AES_KEY"])
    password              AESCrypt.encrypt("password", ENV["AES_KEY"])
    password_confirmation AESCrypt.encrypt("password",ENV["AES_KEY"])
    username              Faker::Name.name 
    end

   trait :unencrypted_user_details do
    email                 Faker::Internet.email
    password              "password"
    password_confirmation "password"
    username              Faker::Name.name 
   end
 end
end

И использовать так же, как в спецификации файла:

user = FactoryBot.create(:user,:unencrypted_user_details)

Но я получаю следующую ошибку при запуске спецификации:

NoMethodError:
   undefined method `name=' for #<User:0x00000006d512f8>

Модель пользователя не имеет поля "имя", вместо этого есть "имя пользователя".

Ошибка стека:

 F

Неудачи:

1) Api :: V2 :: UserApp :: UsersController Generate Pin API генерирует новый пин-код для пользователя Ошибка / Ошибка: пользователь = FactoryBot.create (: unencrypted_user_details)

 NoMethodError:
   undefined method `name=' for #<User:0x0000000664cbb0>
   Did you mean?  name
 # /home/xxxxxxxxx/.rvm/gems/ruby-2.3.3/gems/activemodel-4.2.7.1/lib/active_model/attribute_methods.rb:433:in `method_missing'
 # /home/xxxxxxxxx/.rvm/gems/ruby-2.3.3/gems/factory_bot-4.8.2/lib/factory_bot/attribute_assigner.rb:16:in `public_send'
 # /home/xxxxxxxxx/.rvm/gems/ruby-2.3.3/gems/factory_bot-4.8.2/lib/factory_bot/attribute_assigner.rb:16:in `block (2 levels) in object'
 # /home/xxxxxxxxx/.rvm/gems/ruby-2.3.3/gems/factory_bot-4.8.2/lib/factory_bot/attribute_assigner.rb:15:in `each'
 # /home/xxxxxxxxx/.rvm/gems/ruby-2.3.3/gems/factory_bot-4.8.2/lib/factory_bot/attribute_assigner.rb:15:in `block in object'
 # /home/xxxxxxxxx/.rvm/gems/ruby-2.3.3/gems/factory_bot-4.8.2/lib/factory_bot/attribute_assigner.rb:14:in `tap'
 # /home/xxxxxxxxx/.rvm/gems/ruby-2.3.3/gems/factory_bot-4.8.2/lib/factory_bot/attribute_assigner.rb:14:in `object'
 # /home/xxxxxxxxx/.rvm/gems/ruby-2.3.3/gems/factory_bot-4.8.2/lib/factory_bot/evaluation.rb:13:in `object'
 # /home/xxxxxxxxx/.rvm/gems/ruby-2.3.3/gems/factory_bot-4.8.2/lib/factory_bot/strategy/create.rb:9:in `result'
 # /home/xxxxxxxxx/.rvm/gems/ruby-2.3.3/gems/factory_bot-4.8.2/lib/factory_bot/factory.rb:43:in `run'
 # /home/xxxxxxxxx/.rvm/gems/ruby-2.3.3/gems/factory_bot-4.8.2/lib/factory_bot/factory_runner.rb:29:in `block in run'
 # /home/xxxxxxxxx/.rvm/gems/ruby-2.3.3/gems/activesupport-4.2.7.1/lib/active_support/notifications.rb:166:in `instrument'
 # /home/xxxxxxxxx/.rvm/gems/ruby-2.3.3/gems/factory_bot-4.8.2/lib/factory_bot/factory_runner.rb:28:in `run'
 # /home/xxxxxxxxx/.rvm/gems/ruby-2.3.3/gems/factory_bot-4.8.2/lib/factory_bot/strategy_syntax_method_registrar.rb:20:in `block in define_singular_strategy_method'
 # ./spec/controllers/user_app/users_controller.rb:43:in `block (3 levels) in <top (required)>'

Завершено за 0,37745 секунд (загрузка файлов заняла 4,26 секунды) 3 примера, 1 сбой

user_spec.rb

 describe "Generate Pin API" do
  it "generates a new pin for the user" do
    user = FactoryBot.create(:unencrypted_user_details)  #line 43

    client = user.client

    request.env["HTTP_AUTHORIZATION"] = user.auth_token

    get :generate_pin

    response_json = JSON.parse(response.body)

    expect(response_json["response_code"]).to eq(200)
  end
end

Код контроллера

def generate_pin
phone = ValidatePhone.find_by(phone_no: @client.phone_no)

phone.present? ? phone.update_attributes(is_verified: true) : ValidatePhone.create(phone_no: @client.phone_no)
sms_text = "Hello"
send_sms(@client.phone_no,sms_text)
render :json => {
        :response_code => 200,
        :response_message => "Welcome Onboard."
    }

конец

Это правильный способ создания нескольких фабрик и почему я получаю эту ошибку с неопределенным именем метода?

1 Ответ

0 голосов
/ 09 мая 2018

Это не способ создавать переменные фабрики. Вы должны использовать скобки для полей, значение которых является результатом вызова:

FactoryBot.define do
  factory :user do
   trait :encryption do 
    email    { AESCrypt.encrypt(Faker::Internet.email, ENV["AES_KEY"]) }
    password { AESCrypt.encrypt("password", ENV["AES_KEY"]) }
    password_confirmation { AESCrypt.encrypt("password",ENV["AES_KEY"]) }
    username { Faker::Name.name }
  end

  trait :unencrypted_user_details do
    email                 { Faker::Internet.email }
    password              "password"
    password_confirmation "password"
    username              { Faker::Name.name }
   end
 end
end

Посмотрите на руководства: https://github.com/thoughtbot/factory_bot/blob/master/GETTING_STARTED.md#traits

...