20 дек. 2010 г.

RR, mock, stub, mocha. Назад в будущее.


Мне нужно было протеcтировать фичу которая обрабатывала данные с определенным сроком давности.
Решение "в лоб" - срок давности максимально уменьшить и "подождать" 2-3 секунды в тесте.

Но там 2 секунды, там 3 секунди и я уже слышу ворчание о "медленных тестах" и отдельной машине для их прогонке, и вообще о "тормозности" ruby.


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

Решение простое - перевести стрелки, "застабить" время.

Инструментов маса. Это же Ruby. Mocha, Flex Mock, RSpec mock. Но я выбрал RR.

Причин несколько: rspec-1.x не имеет выделенной библиотеки для моков, как rspec 2.x, а експерементировать намного приятней и быстрей в консоли чем ждать прогона тестов. Mocha и Flex mock довольно "старые", хотелось понять зачем люди написали еще одну бибилотеку(rr). Возможности которые дает RR выше всех перечисленных, да и код с RR насного лаконичнее других. Да и, что немаловажно, RR - лидер на http://ruby-toolbox.com

Итак.
./script/console
extend RR::Adapters::RRMethods
>> now = Time.now
=> Mon Dec 20 10:17:57 +0200 2010
>> stub(Time).now { now.end_of_year + 1.minute }
>> Time.now
=> Sat Jan 01 00:00:59 +0200 2011


И у меня уже новый год!

15 дек. 2010 г.

Выход за рамки. Rails3 scopes are obsolete

В Rails 3 рамки(scopes) стали не актуальны, так как фактически дублируют стандартный функционал Ruby: некий метод который парсит другой метод, что-бы потом его выполнить.

В итоге, методы класса модели стали chainable: последовательный вызов действует как и scopes - объединяет условия.


class Post
scope :recent, imit(5).order(:'create_at desc')
scope :published, where(:published => true)

def self.locked
where('is_locked > 0')
end
end



>> Post.recent
Post Load (0.2ms) SELECT "posts".* FROM "posts" ORDER BY created_at DESC LIMIT 5
=> []
>> Post.recent.locked
Post Load (0.2ms) SELECT "posts".* FROM "posts" WHERE (is_locked > 0) ORDER BY created_at DESC LIMIT 5
=> []
>> Post.recent.locked.published
Post Load (0.3ms) SELECT "posts".* FROM "posts" WHERE (is_locked > 0) AND ("posts"."published" = 't') ORDER BY created_at DESC, is_locked DESC, created_at DESC LIMIT 5
=> []