1

ここに私の工場があります:

スペック/factories.rb

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

  factory :product do
    name 'Great Product'
    about 'this is stuff about the product'
    private false
  end
end

私の製品モデル:

models/product.rb

class Product < ActiveRecord::Base
  attr_accessible :about, :name, :private
  belongs_to :user
  has_many :prices
  validates_presence_of :name
  validates_presence_of :user_id
end

これは、Rspec とShouldaを使用した私のテストです。

スペック/モデル/product_spec.rb

require 'spec_helper'

describe Product do
  before(:each) do
    FactoryGirl.build(:product)
  end

  it { should have_many(:prices) }
  it { should belong_to(:user) }

  it { should validate_presence_of :name }
  it { should validate_presence_of :user_id }
end

テストはパスしましたが、関連付けのためにこれを行うことになっていると思いました。

factory :product do
    name 'Great Product'
    about 'this is stuff about the product'
    private false

    user # <--
end

エラーでこれを行うと、すべてのテストが失敗します。

ActiveRecord::RecordInvalid:
       Validation failed: Time zone is not included in the list

工場で作成したユーザーを本当に割り当てているのでしょうか。

編集

ユーザー.rb

  has_many :products

  validates_presence_of :username
  validates_presence_of :time_zone
  validates_format_of :username, :with => /^(?=(.*[a-zA-Z]){3})[a-zA-Z0-9]+$/
  validates_uniqueness_of :email         
  validates_uniqueness_of :username, :case_sensitive => false
  validates_length_of :username, :within => 3..26
  validates_inclusion_of :time_zone, :in => ActiveSupport::TimeZone.us_zones
4

2 に答える 2

1

工場で使用するタイムゾーンが間違っているため、検証に失敗しました

1.9.3p194 :009 > ActiveSupport::TimeZone.us_zones
=> [(GMT-10:00) Hawaii, (GMT-09:00) Alaska, (GMT-08:00) Pacific Time (US & Canada), (GMT-07:00) Arizona, (GMT-07:00) Mountain Time (US & Canada), (GMT-06:00) Central Time (US & Canada), (GMT-05:00) Eastern Time (US & Canada), (GMT-05:00) Indiana (East)]

1.9.3p194 :010 > ActiveSupport::TimeZone.us_zones.include?('Eastern Time (US & Canada)')
=> false 

工場で次のようなものを使用する必要があります

ActiveSupport::TimeZone.create("Eastern Time (US & Canada)")

検証に合格したい場合。

または、タイムゾーンをデータベースの文字列値に保存する場合は、コードを次のように変更する必要があります

# user.rb
...
validates_inclusion_of :time_zone, :in => ActiveSupport::TimeZone.us_zones.map(&:to_s)

# spec/factories.rb
...
time_zone  "(GMT-05:00) Eastern Time (US & Canada)"
...
于 2012-09-10T18:43:34.783 に答える
1

あなたがするとき

  it { should validate_presence_of :user_id }

shoulda は、 whenuser_idが欠落しているモデルが有効ではないこと、およびエラーのリストに user_id のエラーと適切なメッセージが含まれていることを確認します。オブジェクトが最初に有効かどうか (または他の属性にエラーがあるかどうか) は関係ありません。これが、ファクトリがユーザーを製品に割り当てていないときにテストが成功する理由です。

time_zoneタイムゾーンオブジェクトの配列に文字列()が含まれていることをテストしているため、他のテストが失敗したと思われます-'Eastern Time (US & Canada)'対応するタイムゾーンオブジェクトと等しくありません(のように"1" != 1

于 2012-09-10T18:50:33.343 に答える