Test Helpers - 04/06/07
Desde que entrei no mundo do Test-Driven-Development, venho colecionando alguns helpers, específicos para testes. Estes helpers me ajudam a não-ficar-se-repetindo (DRY ).
Acompanhe a lista de helpers que eu passei a utilizar.
Temos os já consagrados deny, assert_invalid, assert_difference e assert_no_difference. Estes 2 últimos, já fazem parte do trunk do Rails 2.0. Tem também 2 helpers que eu criei, e um que eu reescrevi.
Códigos
Estes métodos vão dentro do arquivo test/test_helper.rb
def deny(condition, message="")
assert !condition, message
end
def assert_invalid(record, message="")
deny record.valid?, message
end
def assert_difference(expression, difference = 1, &block)
expression_evaluation = lambda { eval(expression, block.binding) }
original_value = expression_evaluation.call
yield
assert_equal original_value + difference, expression_evaluation.call
end
def assert_no_difference(expression, &block)
assert_difference expression, 0, &block
end
def assert_select_errors(*messages)
assert_select "div#errorExplanation" do
assert_select "ul" do
assert_select "li" , :count => messages.size
1.upto(messages.size) do |num|
assert_select "li:nth-child(#{num})", "#{messages[num-1]}"
end
end
end
end
def assert_select_form(&block)
assert_select "div.form" do
assert_select "dl" do
yield
assert_select "dd"
end
end
end
def assert_redirected_to(options = {}, message=nil)
super
follow_redirect
assert_response :success
end
Uso
assert_difference
def test_should_destroy
assert_difference "User.count", -1 do
delete :destroy, :id => 1
end
end
def test_should_create
assert_difference "User.count" do
post :create, :user => {}
end
end
assert_no_difference
def test_should_update
assert_no_difference "User.count" do
put :update, :id => 1, :user => {}
end
end
assert_invalid
def test_should_require_name
user = User.create(:name => nil)
assert_invalid user
end
deny
def test_should_require_name
user = User.create(:name => nil)
deny user.valid?
end
assert_select_form
def test_should_get_new
assert_select_form do
assert_select "dt:nth-child(1)" do
assert_select "label", "Name"
end
end
end
assert_select_errors
def test_should_display_errors
user = User.create(:name => nil, :surname => nil)
assert_select_errors "Name can't be blank", "Surname can't be blank"
end
E o assert_redirected_to chama o helper original, e usa o follow_redirect para saber se tudo ocorreu bem com o redirect.
Ah, e se você ainda não entrou nessa de TDD, dê uma olhada neste artigo escrito pelo Nando Vieira sobre Unit Tests. Muito boa referência em português!
04/06/07 às 6:40 pm #Eduardo Fiorezi
Arthur,
Muito bom o artigo ainda nao coloquei a mão no fonte do rails 2.0, gostei dos exemplos.
Abraço