Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 为用户创建多个工厂_Ruby On Rails_Ruby On Rails 4_Rspec_Factory Bot_Rspec Rails - Fatal编程技术网

Ruby on rails 为用户创建多个工厂

Ruby on rails 为用户创建多个工厂,ruby-on-rails,ruby-on-rails-4,rspec,factory-bot,rspec-rails,Ruby On Rails,Ruby On Rails 4,Rspec,Factory Bot,Rspec Rails,早些时候,我为用户建立了一个工厂,它运行良好 但是现在,我想要两套用于用户数据的工厂,一套带有加密的详细信息,另一套带有纯文本用户详细信息 这是我正在使用的代码: FactoryBot.define do factory :user do trait :encryption do email AESCrypt.encrypt(Faker::Internet.email, ENV["AES_KEY"]) password

早些时候,我为用户建立了一个工厂,它运行良好

但是现在,我想要两套用于用户数据的工厂,一套带有加密的详细信息,另一套带有纯文本用户详细信息

这是我正在使用的代码:

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>
失败:

1) Api::V2::UserApp::UsersController生成Pin Api为用户生成新Pin 失败/错误:user=FactoryBot.create(:未加密的用户详细信息)

控制器代码

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."
    }
结束


这是创建多个工厂的正确方法吗?为什么我在未定义的方法名中得到这个错误

这不是创建可变工厂的方法。对于值是调用结果的字段,必须使用括号:

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
请看一下指南:

你的问题是什么?这是创建多个工厂的正确方法吗?为什么我会在未定义的方法名称中出现此错误?Faker::name.name?添加完整的错误跟踪,请Faker::name.name是正确的..我在运行user=FactoryBot.create(:user,:unencrypted\u user\u details)时出错
 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."
    }
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