Мониторинг помех процесса Инициализация экземпляра фабрики - PullRequest
0 голосов
/ 21 ноября 2011

В моем проекте у пользователя будет много элементов , у которых атрибут onshelf_at по умолчанию равен DateTime.now при его создании.

# item.rb
class Item < ActiveRecord::Base

  before_create :calculate_onshelf_time

  default_scope :order => 'items.onshelf_at DESC'

  def calculate_onshelf_time
    self.onshelf_at = DateTime.now
  end

end

В тесте пользовательской модели я пытался убедить себя, что найденный порядок действительно items.onshelf_at DESC. Поэтому я сделал следующий фрагмент, но результат оказался обратным. (а именно [@item1, @item2])

# spec/models/user_spec.rb
before :each do
  @user = User.create(@attr)
  @item1 = Factory(:item, :owner=>@user, :onshelf_at => 2.days.ago, :created_at => 2.days.ago)
  @item2 = Factory(:item, :owner=>@user, :onshelf_at => 1.day.ago, :created_at => 1.day.ago)        
end


it "should have the right items in the right order" do
  @user.items.should == [@item2, @item1]
end

Я проверил консоль и обнаружил, что onshelf_at не слушал инициализацию экземпляра Factory Girl. Вместо этого он следовал правилу before_create и ценился до времени запуска теста!

Failure/Error: @user.items.should == [@item2, @item1]
   expected: [#<Item id: 2, description: "this is an item", img_link: "http://www.example.com/photos/some_pic.jpg", category_id: 5, onshelf: true, created_at: "2011-11-20 11:19:15", updated_at: "2011-11-21 11:19:15", onshelf_at: "2011-11-21 11:19:15", owner_id: 1>, #<Item id: 1, description: "this is an item", img_link: "http://www.example.com/photos/some_pic.jpg", category_id: 5, onshelf: true, created_at: "2011-11-19 11:19:15", updated_at: "2011-11-21 11:19:15", onshelf_at: "2011-11-21 11:19:15", owner_id: 1>]
        got: [#<Item id: 1, description: "this is an item", img_link: "http://www.example.com/photos/some_pic.jpg", category_id: 5, onshelf: true, created_at: "2011-11-19 11:19:15", updated_at: "2011-11-21 11:19:15", onshelf_at: "2011-11-21 11:19:15", owner_id: 1>, #<Item id: 2, description: "this is an item", img_link: "http://www.example.com/photos/some_pic.jpg", category_id: 5, onshelf: true, created_at: "2011-11-20 11:19:15", updated_at: "2011-11-21 11:19:15", onshelf_at: "2011-11-21 11:19:15", owner_id: 1>] (using ==)

Как я могу это исправить?

1 Ответ

1 голос
/ 21 ноября 2011

Быстрое решение состоит в том, чтобы добавить условие к вашему calculate_onshelf_time методу:

 self.onshelf_at = DateTime.now if self.onshelf_at.nil?

Но - вам все это даже не нужно.Если вы можете (то есть, если у вас есть контроль над схемой), замените атрибут onshelf_at на столбец created_at, который будет автоматически установлен Rails во время создания.Если вы используете миграции:

 create_table :foo do |t|
   # ...
   t.timestamps
 end

добавит к модели метки времени created_at и updated_at.

...