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!

Tags: , , / Trackback URI: trackback

Um comentário em “Test Helpers”

  1. 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

Deixe um comentário

Não é aceito código HTML