Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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 3 FactoryGirl,2次创建用户?_Ruby On Rails 3_Rspec_Factory Bot - Fatal编程技术网

Ruby on rails 3 FactoryGirl,2次创建用户?

Ruby on rails 3 FactoryGirl,2次创建用户?,ruby-on-rails-3,rspec,factory-bot,Ruby On Rails 3,Rspec,Factory Bot,我真的不懂如何与人交往。我有一个特殊的助手 def log_in_user user = User.find_by_name 'User1' user = FactoryGirl.create :user1 unless user sign_in user end 在rspec中 let(:product) { FactoryGirl.build :product_A } describe "GET confirm purchase" do it "xxx" do

我真的不懂如何与人交往。我有一个特殊的助手

def log_in_user
  user = User.find_by_name 'User1'
  user = FactoryGirl.create :user1 unless user
  sign_in user
end
在rspec中

let(:product) { FactoryGirl.build :product_A }


describe "GET confirm purchase" do
    it "xxx" do
      log_in_user

      Product.should_receive(:find_active_by_id).with("1").and_return(product)

       ...
   end
end
工厂.rb

FactoryGirl.define do
    factory :user do
        encrypted_password 'abcdef1'
        confirmed_at Time.now

            factory :user1 do
              email 'user1@test.com'
              name 'User1'
              year 1984
            end
    end

    factory :product do
        factory :product_A do
          name "product A"
          association :user, factory: :user1
        end
    end
end
运行测试用例时发生异常: ActiveRecord::RecordInvalid:验证失败:已接收电子邮件

看起来user1创建了2次,一次在log\u in\u user中,第二次在factory中:association:user,factory::user1

我是对的?如果是,我如何解决这个问题?我想创建用户并在factory product中定义关联


最佳当您在工厂
:product\u A
时,它会自动呼叫工厂以获取
:user1

然后,您再次在
登录用户中创建
:user1
,但对唯一电子邮件的验证阻止创建第二封
:user1

我建议您将电子邮件设置为
序列
,如下所示:

FactoryGirl.define do
  sequence :email do |n|
    "user#{n}@test.com"
  end

  factory :user do
    encrypted_password 'abcdef1'
    confirmed_at Time.now

    factory :user1 do
      email
      name 'User1'
      year 1984
    end
  end

  factory :product do
    factory :product_A do
      name "product A"
      association :user, factory: :user1
    end
  end

end
然后,我将更改
登录用户
,将(可选)用户作为如下选项:

def log_in_user(user)
  user =|| User.find_by_name 'User1'
  user =|| FactoryGirl.create :user1
  sign_in user
end
并修改测试用例以将该用户对象传递给登录:

let(:product) { FactoryGirl.build :product_A }

describe "GET confirm purchase" do
  it "xxx" do
    log_in_user(product.user)
    Product.should_receive(:find_active_by_id).with("1").and_return(product)
 end
end

我想这不是他最初的问题吗?@RyanBigg我读到的问题是他不明白为什么它试图创建两个用户。我详述了我可能会如何进行。