Есть ли способ предотвратить необходимость указывать ассоциации в тестах? - PullRequest
1 голос
/ 08 июля 2011

Учитывая, что у меня есть следующий класс

class listing > ActiveRecord::Base
  attr_accessible :address
  belongs_to :owner

  validates :owner_id, presence: true
  validates :address, presence: true
end

Есть ли способ избавиться от необходимости связывать владельца, прежде чем я сохраню список в моих тестах в /spec/models/listing_spec.rb, не делая1005 * доступно через массовое назначение?

describe Listing do
  before(:each) do
    @owner = Factory :owner
    @valid_attr = {
      address: 'An address',
    }
  end

  it "should create a new instance given valid attributes" do
    listing = Listing.new @valid_attr
    listing.owner = @owner
    listing.save!
  end

  it "should require an address" do
    listing = Listing.new @valid_attr.merge(:address => "")
    listing.owner = @owner
    listing.should_not be_valid
  end
end

Ответы [ 3 ]

1 голос
/ 20 ноября 2012

Не нужно использовать фабричницу (если вы не хотите ...):

let(:valid_attributes) { address: 'An Address', owner_id: 5}

it "creates a new instance with valid attributes" do
  listing = Listing.new(valid_attributes)
  listing.should be_valid
end

it "requires an address" do
  listing = Listing.new(valid_attributes.except(:address))
  listing.should_not be_valid
  listing.errors(:address).should include("must be present")
end

it "requires an owner_id" do
  listing = Listing.new(valid_attributes.except(:owner_id))
  listing.should_not be_valid
  listing.errors(:owner_id).should include("must be present")
end
0 голосов
/ 22 мая 2013

Я не хочу быть голосом несогласных здесь, но вам не следует звонить save! или valid? вообще в вашей спецификации проверки.И 9 раз из 10, если вам нужно использовать заводскую девушку, чтобы просто проверить правильность вашей модели, что-то не так.То, что вы должны делать, это проверять наличие ошибок по каждому из атрибутов.

Лучший способ написать вышеизложенное будет выглядеть так:проверяйте наличие наличия адреса, вы хотите убедиться, что это не ноль, не пустая строка и что он не длиннее определенной длины.Вы можете использовать validates_length_of для этого.

0 голосов
/ 14 июля 2011

Есть, если вы используете фабрикант

  # it's probably not a good idea to use FG in the first one
  it "should create a new instance given valid attributes" do
    listing = Listing.new @valid_attr
    listing.owner = @owner
    listing.property_type = Factory(:property_type)
    listing.save!
  end

  it "should require an address" do
    # But here you can use it fine
    listing = Factory.build :listing, address: ''
    listing.should_not be_valid
  end

  it "should require a reasonable short address" do
    listing = Factory.build :listing, address: 'a'*245
    listing.should_not be_valid
  end
...