Упорядочение по create_at в модульных тестах с генерируемыми данными в рельсах - PullRequest
3 голосов
/ 15 ноября 2009

У меня есть немного кода, который в основном отображает последние x (переменная, но допустим, x здесь 20) обновлений, сделанных в данной таблице. В одном из модульных тестов у меня есть этот фрагмент:

EditedItem.push_to_queue(hiddennow)
#create some new entries and save them
20.times{ EditedItem.push_to_queue(random_item) }
Queue.get_entries.each{|entry| assert_not_equal too_far_down, entry}

Может быть, а может и не быть красивым, но это дает понять смысл Объект hiddennow был помещен в очередь слишком далеко и больше не должен возвращаться при вызове get_entries.

#this works
SearchObject.find(:all, :order => "id desc")

#this does not, unless the 20.times loop has sleep(1) or something
SearchObject.find(:all, :order => "created_at desc")

Это немного упрощено, но похоже, что цикл 20.times добавляет вещи настолько быстро, что не может различить порядок по выражению в create_at. Мои вопросы, я делаю что-то в корне неправильно? Если нет, то какой подход лучше написать тест по этим направлениям?

Ответы [ 2 ]

5 голосов
/ 15 ноября 2009

DigitalRoss прав. created_at имеет гранулярность в одну секунду.

Один из вариантов - установить created_at при создании объектов:

old = EditItem.new(:created_at => 1.second.ago)
older = EditItem.new(:created_at => 2.seconds.ago)

Другой вариант - использовать заглушку, чтобы связываться с классом Time. Следующее будет работать с Rspec, но может быть легко выполнено с помощью других фальшивых фреймворков, таких как Mocha.

@seconds = Time.now.to_i
Time.stub!(:now).and_return{Time.at(@seconds += 5) }

Это будет возвращать время на 5 секунд больше, чем предыдущее, каждый раз, когда вы звоните Time.now.

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

1 голос
/ 15 ноября 2009

Времена, относящиеся к файлам и записям (и особенно к временам в Rails), обычно хранятся в времени Unix или времени POSIX . Этот формат сохраняет количество секунд с 1970 года в арифметическом виде.

Итак, время для этих целей имеет 1 секунду детализации.

Рельсы не могут упорядочить hiddennow против случайных предметов без задержки, равной по крайней мере одной секунде, и набор из 20 не будет упорядочен вообще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...