0

この問題は工場に関係していますが、最初にlocation_spec.rbを表示します。

require 'spec_helper'

describe Location do

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

  subject { @location }

  describe "should be valid in general" do
    it { should be_valid }
  end

  describe "when user_id is not present" do
    before { @location.user_id = nil }
    it { should_not be_valid }
  end

  describe "when owner_id is not present" do
    before { @location.owner_id = nil }
    it { should_not be_valid }
  end
end

ここに私の工場があります.rb

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'


    association :owner, strategy: :build
  end
end

Location.rb

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

これが私が得るエラーです:

Failures:

  1) Location should be valid in general
     Failure/Error: it { should be_valid }
       expected valid? to return true, got false
    #./spec/models/location_spec.rb:53:in `block (3 levels) in <top (required)>'

私が信じている場所の関連付けを間違って構築しているため、このエラーが発生します。関連付けは、ユーザーと所有者が既に保存されている必要があり、場所が両方に既に割り当てられているだけではありません。私は自分の工場で正しい方向に進んでいますか、それとも何か他のものですか? どう思いますか?

前もって感謝します。

4

1 に答える 1

3

このオプションは、関連するモデル (所有者) を と の両方にstrategy: :build実際に保存しないように FactoryGirl に指示します。これはあなたが望むものではないと思います。FactoryGirl.createFactoryGirl.build

次のように、所有者のファクトリ ラインを justownerに変更してみてください。

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
end

これにより、場所レコードをインスタンス化する前に関連付けを作成して、場所が有効になるようにします。これを行わないと、owner_id割り当てるものがないため (所有者がまだ作成されていないため)、親 (場所) の検証は失敗します。

更新

user工場内の関連付けも欠落しているようですlocation。これも検証されます。したがって、それをファクトリにも追加して、それを通過させます。

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

そうすべきだと思います。

于 2012-09-14T02:08:19.660 に答える