2

ネストされた属性を受け入れる場所をモデル化する必要があります。ネストされた属性が空白にならないことなどを確認するテストを作成したいと思います。テストの作成方法が本当にわかりません。

私の2つの単純なモデル:

# SeoMapping Model
class SeoMapping < ActiveRecord::Base
  belongs_to :mappingtable, :polymorphic => true
  attr_accessible :seo_url
  validates :seo_url, :presence => true, :uniqueness => true   
end

# Page Model
class Page < ActiveRecord::Base
  has_one :seo_mappings, :as => :mappingtable, :dependent => :destroy
  accepts_nested_attributes_for :seo_mappings 
  attr_accessible :content, :h1, :meta_description, :title, :seo_mappings_attributes
  .........
end

Page と Seo の工場は次のとおりです。

FactoryGirl.define do
  factory :page do |f|
    seo_mapping
    f.title { Faker::Name.name }
    f.h1 { Faker::Lorem.words(5) }
    f.meta_description { Faker::Lorem.words(10) }
    f.content { Faker::Lorem.words(30) }
  end
end

FactoryGirl.define do
  factory :seo_mapping do |f|
    f.seo_url { Faker::Internet.domain_word }
  end
end

そして私のテスト:

require 'spec_helper'

describe Page do
  it "has a valid factory" do
    expect(create(:page)).to be_valid
  end

  # Cant get this spec to work?
  it "it is invalid without a seo_url" do
    page = build(:page)
    seo_mapping = build(:seo_mapping, seo_url: nil)
    page.seo_mapping.should_not be_valid
    # expect(build(:page, :seo_mapping_attributes[:seo_url] => nil)).to_not be_valid
  end

  it "is invalid without a title" do
    expect(build(:page, title: nil)).to_not be_valid
  end
  ...............
end
4

1 に答える 1

1

通常、この種のものには、shoulda_matchersと呼ばれるgemを使用します。モデルが特定の属性の存在を検証することを簡単に主張できます。

it { should validate_presence_of(:seo_url) }
it { should validate_uniqueness_of(:seo_url) }

gemを使用したくない場合は、次のようにしてみてください。

seo_mapping = build(:seo_mapping, seo_url: nil)
page = build(:page, seo_mapping: seo_mapping)
page.should_not be_valid
于 2012-08-27T10:45:19.533 に答える