1

由于位置属于我的应用程序中的所有者和用户,我想根据这个事实来构建它。所以在我的工厂里是这样的:

FactoryGirl.define do
  factory :user do
    username   'user1'
    email      'user@example.com'
    timezone   'Eastern Time (US & Canada)'
    password   'testing'
  end

  factory :owner do
    name    'Owner One'
    user
  end

  factory :location do
    name 'Location One'
    about 'About this location'
    website 'http://www.locationone.com/'
    phone_number '12 323-4234'
    street_address 'Shibuya, Tokyo, Japan'
    owner
    user
  end
end

比我有我的规范/模型/location_spec.rb

describe Location do
  before(:each) do
    @location = FactoryGirl.build(:location)
  end
end

比我的模型location.rb

class Location < ActiveRecord::Base
  attr_accessible :name, :about. :website, phone_number, 
                  :street_address, owner_id
  belongs_to :user 
  belongs_to :owner
end

注:owner_id可用是因为可以选择。

尽管如此,它会返回我的测试失败:

Failure/Error: @location = FactoryGirl.build(:location) 
     ActiveRecord::RecordInvalid: 
       Validation failed: Email has already been taken, Email has already been taken, Username

我希望这是因为所有者在不应该创建用户时首先创建用户,然后该位置创建相同的用户。那么我该如何解决呢?

4

2 回答 2

0

你可以这样写关联

User
has_one :locations

Owner
has_one :locations

Location
belongs_to :users
belongs_to :owner

虽然这个关联会起作用并且它与 FactoryGirl 无关。而且我觉得这个设计不好,为什么要让所有者成为不同的领域,假设一个位置是否属于不同的用户和所有者。您也可以通过在用户模型中添加字段 is_owner 来做到这一点,无需为所有者创建不同的模型。

根据目前的信息,我可以说这么多。

也尝试改变你的工厂女孩​​实施

FactoryGirl.define  do
  factory :user, :class=> User do |f|    
    f.username   'user1'
    f.email      'user@example.com'
    f.timezone   'Eastern Time (US & Canada)'
    f.password   'testing'  
  end
end

FactoryGirl.define do
  factory :owner do, :class => Owner do |f|
    f.name    'Owner One'
    f.about   ''
    f.private false    
  end 
end

谢谢

于 2012-09-13T04:35:11.207 回答
0

不得不为我的工厂添加序列。就是这样。https://github.com/thoughtbot/factory_girl/wiki/Usage

factory :user do
  sequence(:username)  { |n| "User#{n}" }
  sequence(:email)     { |n| "User#{n}@example.com"}  
  timezone   'Eastern Time (US & Canada)'
  password   'testing'
end
于 2012-09-14T22:15:50.457 回答