niedziela, 26 lutego 2012

How to proper test scopes (named scopes)


I just read few posts about "how to test named scopes". I'm asking - why should I use FactoryGirl and create tons of unnecessary objects just to test `order(:position).first`?!

How not to do this


require 'spec_helper'
describe Post do
context '#recent' do
it 'should return most recent post' do
_, post = [Factory(:post), Factory(:post)]
Post.recent.should == post
end
end
context '#for_user' do
it 'should return only posts created by given user' do
post1, post2, _ = [Factory(:post, user_id: 1), Factory(:post, user_id: 1), Factory(:post, user_id: 2)]
Post.for_user(1).should == [post1, post2]
end
end
end
view raw post_spec.rb hosted with ❤ by GitHub
We've just created .. let's count .. 5 objects and made 2 unnecessary db queries

How to do this


require 'spec_helper'
describe Post do
context '#recent' do
it 'should return most recent post' do
post = mock_model Post
Post.should_receive(:order).with('created_at DESC').and_return post
post.should_receive(:first).and_return post
Post.recent
end
end
context '#for_user' do
it 'should return only posts created by given user' do
post = mock_model Post
Post.should_receive(:where).with(user_id: 1)
Post.for_user 1
end
end
end
view raw post_spec.rb hosted with ❤ by GitHub
It's useless to test Rails (it's really proper tested). We need to spec messages that goes between objects and given parameters.

czwartek, 16 lutego 2012

named_accessors: attr_accessors na sterydach

attr_accessor jest świetne (szczególnie jeżeli ktoś przychodzi do Rubiego np. z Javy), ale ma jedną zasadniczą wadę - nazwa zmiennej instancji == nazwa metody (settera i gettera). W 99% to bardzo dobrze, ale dla tego jednego procenta powstało named_accessors.

class Foobar
def initialize(foo, bar)
@foo, @bar = foo, bar
end
named_reader :foo, as: :foobar
named_writer :bar, as: :barbaz
# named_accessor :variable_name, as: :method_name
end
Mam nadzieję że komuś się kiedyś przyda :)

poniedziałek, 23 stycznia 2012

param_protected i Devise

Kilka dni temu pisałem już o gemie param_protected. Jeżeli używamy go razem z Devise, będziemy musieli zrobić zmodyfikować kontrolery i dodać definicję dozwolonych parametrów.

Po pierwsze musimy zmapować URL-e na nasze nowe kontrolery.

MyApp::Application.routes.draw do
devise_for :users, controllers: {
registrations: 'auth/devise/registrations',
sessions: 'auth/devise/sessions',
# ...
}
end
view raw routes.rb hosted with ❤ by GitHub

niedziela, 22 stycznia 2012

Hakierzy

Mam dość komentarzy na temat tych ciągłych ataków na rządowe strony. Jak można wypowiadać się na dany temat bez żadnej wiedzy.