FactoryGirl可以在每次生成实例时设置变量吗?

时间:2014-06-29 20:07:16

标签: ruby-on-rails ruby ruby-on-rails-4 factory-bot

我正在尝试为每个实例的变量分配一个新公钥和私钥的数组,这样我就可以生成一个唯一且匹配的比特币地址和签名。

我正在使用bitcoin-ruby gem来生成密钥。

问题在于我无法确定放置key = Bitcoin::generate_key

的位置

这是我的工厂没有key = Bitcoin::generate_key

FactoryGirl.define do
  factory :user do
    sequence(:username)       { |n| "Person #{n}" }
    sequence(:email)          { |n| "person_#{n}@example.com" }
    bitcoin_address           { Bitcoin::pubkey_to_address(key[1]) }
    bitcoin_address_signature { BitcoinCigs.sign_message!(key[0], "test") }
    password                  "examplepass"
    password_confirmation     "examplepass"
  end
end

我试图将它放在规范帮助程序中以及文件中的任何位置,但它被忽略或生成语法错误。我最接近的是:

FactoryGirl.define do
  factory :user do
    sequence(:username)       { |n| "Person #{n}" }
    sequence(:email)          { |n| "person_#{n}@example.com" }
    bitcoin_address           { key = Bitcoin::generate_key
                                Bitcoin::pubkey_to_address(key[1]) }
    bitcoin_address_signature { key = Bitcoin::generate_key
                                BitcoinCigs.sign_message!(key[0], "test") }
    password                  "examplepass"
    password_confirmation     "examplepass"
  end
end

这导致bitcoin_addressbitcoin_address_signature的不同密钥对。

我还没有找到一种方法让keybitcoin_addressbitcoin_address_signature的意思相同,同时仍然传递唯一性验证器,我错过了一些明显的或是我这样做完全错了吗?

1 个答案:

答案 0 :(得分:1)

使用after(:build)挂钩:

FactoryGirl.define do
  factory :user do
    sequence(:username)       { |n| "Person #{n}" }
    sequence(:email)          { |n| "person_#{n}@example.com" }
    password                  "examplepass"
    password_confirmation     "example pass"

    after(:build) do |user|
      key = Bitcoin::generate_key
      user.bitcoin_address = Bitcoin::pubkey_to_address(key[1])
      user.bitcoin_address_signature = BitcoinCigs.sign_message!(key[0], "test")
    end
  end
end