<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Desenvolvimento &#193;gil - Blog da Improve It: Como Testar parte 1 - Models</title>
    <link>http://blog.improveit.com.br/articles/2008/10/26/como-testar-parte-1-models</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description></description>
    <item>
      <title>Como Testar parte 1 - Models</title>
      <description>&lt;p&gt;Quando comecei a estudar &lt;a href="http://www.improveit.com.br/xp"&gt;Extreme Programming&lt;/a&gt; descobri que n&#227;o &#233; poss&#237;vel fazer nenhum software de qualidade sem uma excelente base de testes. Desde ent&#227;o tenho me dedicado muito ao estudo das mais diversas ferramentas e t&#233;cnicas para elaborar bons de testes.&lt;/p&gt;

&lt;p&gt;O assunto testes &#233; bastante pol&#234;mico e n&#227;o pretendo (nesse post) tentar convencer ningu&#233;m da import&#226;ncia deles. Se voc&#234; n&#227;o faz testes e/ou discorda de qualquer uma das minhas afirma&#231;&#245;es deixo algumas perguntas para voc&#234; refletir.&lt;/p&gt;

&lt;p&gt;1 - Quantos bugs fixes voc&#234; fez esse ano?&lt;/p&gt;

&lt;p&gt;2 - Quantos tickets abertos existem no seu bug tracker?&lt;/p&gt;

&lt;p&gt;3 - Quantas vezes voc&#234; fez um deploy de uma nova vers&#227;o em uma sexta feira de tarde e saiu mais cedo do trabalho?&lt;/p&gt;

&lt;p&gt;4 - Quantas vezes voc&#234; "virou a noite" esse ano?&lt;/p&gt;

&lt;p&gt;Acabei me tornando um evangelizador de testes por&#233;m nunca fiz nada muito pr&#225;tico para passar o conhecimento que eu adquiri para a comunidade. S&#243; que agora vou me redimir dessa falha iniciando uma s&#233;rie de posts onde vou expor um problema e como EU testaria usando Test::Unit e Rspec. N&#227;o vou falar de Shoulda pois n&#227;o gosto dele. :-)&lt;/p&gt;

&lt;p&gt;A id&#233;ia de escrever essa s&#233;rie de posts sobre testes surgiu logo ap&#243;s a grava&#231;&#227;o do terceiro epis&#243;dio do &lt;a href="http://railsbox.org/2008/9/9/railsbox-podcast-3"&gt;RailsBox&lt;/a&gt; e gostaria de agradecer ao Ozeias e ao Davis Cabral por terem me motivado.&lt;/p&gt;

&lt;p&gt;"Back to the cold cow..."&lt;/p&gt;

&lt;p&gt;O ActiveRecord simplifica muito nossos modelos por&#233;m tenho observado que em v&#225;rios projetos os desenvolvedores deixam de testar corretamente os seus modelos usando a  alega&#231;&#227;o que n&#227;o v&#227;o testar alguma coisa que o Rails j&#225; testou. Esse &#233; um argumento valido em alguns casos pois voc&#234; est&#225; apenas delegando responsabilidades mas voc&#234; sempre deve testar se a responsabilidade foi realmente delegada.&lt;/p&gt;

&lt;p&gt;Um exemplo cl&#225;ssico s&#227;o as valida&#231;&#245;es. Teoricamente voc&#234; n&#227;o precisaria testar como elas s&#227;o implementadas mas deve testar se elas realmente existem pois se algu&#233;m remove-las seus testes v&#227;o continuar passando mas sua aplica&#231;&#227;o estar&#225; quebrada e/ou permitindo inconsist&#234;ncias de banco de dados.&lt;/p&gt;

&lt;p&gt;Nesse post vou mostrar como testar alguns comportamento do ActiveRecord usando como base o modelo User. Todos os c&#243;digos citados nesse post fazem parte de um projeto How Test que est&#225; dispon&#237;vel em: http://github.com/tapajos/how-test&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class User &amp;lt; ActiveRecord::Base
  validates_presence_of :name
  validates_format_of :mail, 
                      :with =&amp;gt; /([-.\w^@]+@(?:[-\w]+.)+[A-Za-z]{2,4})+/i,
                      :on =&amp;gt; :create,
                      :allow_nil =&amp;gt; true
  has_many :accounts
  named_scope :actives, :conditions =&amp;gt; ["active = ?", true]
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Uma boa estrat&#233;gia para orientar o desenvolvimento dos teste &#233; elaborar algumas perguntas que dar&#227;o origem aos seus cen&#225;rios de testes.&lt;/p&gt;

&lt;h3&gt;Valida&#231;&#227;o do nome&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Posso cadastrar um usu&#225;rio sem nome? N&#227;o&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;Testando usando Test:Unit:&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;def test_if_check_presence_of_name
  assert !@user.valid?, "Should be invalid"
  assert_equal "can't be blank", @user.errors[:name]
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Na primeira linha desse teste o assert recebe um segundo par&#226;metro que por ser opcional n&#227;o &#233; muito comentado mas merece uma aten&#231;&#227;o especial. Esse argumento nada mais &#233; do que a mensagem que ser&#225; exibida quando o teste quebrar. Quando voc&#234; omite esse par&#226;metro o teste quebra exibindo a mensagem 'false is not true' que n&#227;o ajuda muito a entender o que est&#225; acontecendo.&lt;/p&gt;

&lt;h4&gt;Testando usando RSpec:&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;it "should reject if name is not given" do
  @user.should have(1).error_on(:name)
  @user.errors[:name].should == "can't be blank"
end
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Valida&#231;&#227;o do e-mail.&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Posso criar um registro com um e-mail inv&#225;lido? N&#227;o&lt;/li&gt;
&lt;li&gt;Posso atualizar um regitro com um e-mail inv&#225;lido? Sim&lt;/li&gt;
&lt;li&gt;Posso criar um registro com um e-mail em branco? Sim&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;Testando usando Test:Unit:&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;VALIDS_MAIL = %w(foo@bar.com foo@bar.com.br foo@globo.com foo@i_hate_the_microsoft.com foo@i_love_my_mac.com)
INVALIDS_MAIL = %w(foobar.com foo@bar i_hate_the_microsoft.com i_love_my_mac.com)

def test_if_reject_invalid_format_os_mail_on_create
  INVALIDS_MAIL.each do |mail|
    @user.mail = mail
    assert !@user.valid?, "Should be invalid when mail is #{mail}"
    assert_equal "is invalid", @user.errors[:mail]
  end
end

def test_if_not_reject_when_mail_is_nil
  @user.name = "Tapaj&#243;s"
  assert @user.valid?, "Should be valid"
end

def test_if_not_check_format_of_mail_on_update
  @user.name = "Tapaj&#243;s"
  assert @user.save, "Should save"
  @user.mail = "an invalid mail"
  assert @user.valid?, "Should be valid"
end

def test_if_accept_a_valid_mail
  VALIDS_MAIL.each do |mail|
    @user.name = "Tapaj&#243;s"
    @user.mail = mail
    assert @user.valid?, "Should be valid when mail is #{mail}"
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;Testando usando RSpec:&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;INVALIDS_MAIL.each do |mail|
  it "should reject because #{mail} is an invalid mail" do
    @user.mail = mail
    @user.should have(1).error_on(:mail)
    @user.errors[:mail].should == "is invalid"
  end
end

VALIDS_MAIL.each do |mail|
  it "should be valid when mail is #{mail}" do
    @user.mail = mail
    @user.should_not have(1).error_on(:mail)
  end
end

it "should not reject if mail is not given" do
  @user.name = "Tapaj&#243;s"
  @user.should be_valid
end

it "should not check mail format on update" do
    @user.name = "Tapaj&#243;s"
    @user.save.should be_true
    @user.mail = "an invalid mail"
    @user.should be_valid
end
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Testando o relacionamento com Account.&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Um usu&#225;rio pode ter mais de uma conta? Sim&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;Testando usando Test::Unit:&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;def test_has_many_accounts
  association = User.reflect_on_association(:accounts)
  assert association, "Association with account is not found"
  assert_equal :has_many, association.macro
end
&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;Testando usando RSpec:&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;it "should has many accounts" do
  association = User.reflect_on_association(:accounts)
  association.should_not be_nil
  association.macro.should == :has_many
end
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Testando o User.actives&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Posso listar usu&#225;rios inativos? N&#227;o&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;Testando usando Test::Unit:&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;def test_if_actives_use_the_correct_conditions
  assert_equal({:conditions=&amp;gt;["active = ?", true]}, User.actives.proxy_options)
end
&lt;/code&gt;&lt;/pre&gt;

&lt;h4&gt;Testando usando RSpec:&lt;/h4&gt;

&lt;pre&gt;&lt;code&gt;it "should find for all users that status of active is true" do
  User.actives.proxy_options.should == {:conditions=&amp;gt;["active = ?", true]}
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Para esse post ficar mais simples e curto n&#227;o me preocupei em validar se o tamanho m&#225;ximo dos campos est&#225; coerente com o tamanho m&#225;ximo permitido pelo tipo no banco de dados. Essa &#233; uma valida&#231;&#227;o EXTREMAMENTE importante que n&#227;o deve ser esquecida!&lt;/p&gt;

&lt;p&gt;No pr&#243;ximo post dessa s&#233;rie falarei um pouco sobre a &lt;a href="http://en.wikipedia.org/wiki/Law_of_Demeter"&gt;Lei de Demeter&lt;/a&gt;, como respeita-la e testar alguns m&#233;todos usando &lt;a href="http://en.wikipedia.org/wiki/Mock_Object"&gt;Mock Objects&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;O que voc&#234; achou desse artigo? O que voc&#234; gostaria de saber sobre testes de ActiveRecord que eu n&#227;o falei aqui?&lt;/p&gt;

&lt;p&gt;Aguardo o feedback de voc&#234;s.&lt;/p&gt;</description>
      <pubDate>Sun, 26 Oct 2008 02:51:35 -0200</pubDate>
      <guid isPermaLink="false">urn:uuid:aa3262eb-fd9b-4304-9bb1-f6ef0d945ee2</guid>
      <author>Marcos Tapaj&#243;s</author>
      <link>http://blog.improveit.com.br/articles/2008/10/26/como-testar-parte-1-models</link>
      <category>rspec</category>
      <category>test</category>
      <category>unit</category>
      <category>Testes</category>
      <category>ruby</category>
      <category>rails</category>
      <category>rspec_on_rails</category>
    </item>
    <item>
      <title>"Como Testar parte 1 - Models" by Guilherme</title>
      <description>&lt;p&gt;Parab&#233;ns, excelente artigo ! :D
show de bola!
Podia ter mais.. haha =D&lt;/p&gt;</description>
      <pubDate>Thu, 22 Jan 2009 17:51:21 -0200</pubDate>
      <guid isPermaLink="false">urn:uuid:51dca330-91f8-4108-8825-c6228b8ded27</guid>
      <link>http://blog.improveit.com.br/articles/2008/10/26/como-testar-parte-1-models#comment-1646</link>
    </item>
    <item>
      <title>"Como Testar parte 1 - Models" by Rafael Quintana</title>
      <description>&lt;p&gt;Fala pessoal,&lt;/p&gt;

&lt;p&gt;O ActiveRecord &#233; muito bom mesmo, inclusive tem inspirando outros projetos em outras plataformas, como o iPhone. Isso mesmo, existe ActiveRecord para iPhone e &#233; muito parecido com o de Ruby on Rails, s&#243; que &#233; em Objective C. Escrevi um pouco sobre ele nesse link:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.mobits.com.br/2009/1/6/mapeamento-objeto-relacional-no-iphone" rel="nofollow"&gt;http://www.mobits.com.br/2009/1/6/mapeamento-objeto-relacional-no-iphone&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Abra&#231;os e sucesso a Improve It!&lt;/p&gt;</description>
      <pubDate>Tue, 13 Jan 2009 12:43:57 -0200</pubDate>
      <guid isPermaLink="false">urn:uuid:0f08f982-426d-4349-9045-388b1526bb04</guid>
      <link>http://blog.improveit.com.br/articles/2008/10/26/como-testar-parte-1-models#comment-1640</link>
    </item>
    <item>
      <title>"Como Testar parte 1 - Models" by Rodrigo Reginato</title>
      <description>&lt;p&gt;legal o reflect_on_association, curti muito!!
valew&lt;/p&gt;</description>
      <pubDate>Sat, 20 Dec 2008 12:08:02 -0200</pubDate>
      <guid isPermaLink="false">urn:uuid:4602cc59-cf9b-41f7-9561-ce54e6cdd21b</guid>
      <link>http://blog.improveit.com.br/articles/2008/10/26/como-testar-parte-1-models#comment-1627</link>
    </item>
    <item>
      <title>"Como Testar parte 1 - Models" by elomarns</title>
      <description>&lt;p&gt;Sei que esse post j&#225; &#233; meio antigo (22 dias na Web &#233; uma eternidade), mas s&#243; pude ler agora, e n&#227;o posso deixar de dizer que ele foi excelente. &lt;/p&gt;

&lt;p&gt;O artigo mostrou exemplos bem claros, mesmo para quem n&#227;o sabe muito sobre testes, como eu, que sei bem pouco sobre RSpec e posso dizer que j&#225; aprendi a escrever alguns testes b&#225;sicos com ele. A maior prova disso &#233; que eu escrevi o teste do named scope com RSpec logo ap&#243;s ver o mesmo teste com Test::Unit, e vi que escrevi exatamente como indicado no artigo. &lt;/p&gt;

&lt;p&gt;Al&#233;m disso, aprendi alguns recursos do Rails interessantes, como o reflect_on_association e o proxy_options, sendo que esse &#250;ltimo eu j&#225; tinha visto, mas n&#227;o tinha parado pra ver como funciona.&lt;/p&gt;

&lt;p&gt;Em rela&#231;&#227;o a filosofias ao elaborar os testes, eu sou mais voltado a testar o comportamento, por isso estranhei um pouco o teste do named scope, mas acho que isso varia conforme as prefer&#234;ncias pessoais e com a aplica&#231;&#227;o em quest&#227;o, n&#227;o existindo algo que possa ser considerado como o jeito definitivamente certo.&lt;/p&gt;

&lt;p&gt;Sobre a quest&#227;o de uma asser&#231;&#227;o por teste, apesar de estranhar inicialmente, me parece uma boa id&#233;ia, principalmente depois dos argumentos apresentados.&lt;/p&gt;

&lt;p&gt;Por fim, n&#227;o tem como deixar de mencionar os coment&#225;rios de alt&#237;ssimo n&#237;vel desse post. Gra&#231;as a eles e aos links postados eu aprendi um monte de outras coisas bem interessantes.&lt;/p&gt;

&lt;p&gt;Enfim, parab&#233;ns pela excelente id&#233;ia de publicar essa s&#233;rie de posts.&lt;/p&gt;</description>
      <pubDate>Tue, 18 Nov 2008 14:54:00 -0200</pubDate>
      <guid isPermaLink="false">urn:uuid:1591e48c-c6a1-4119-be44-44a58ead6cae</guid>
      <link>http://blog.improveit.com.br/articles/2008/10/26/como-testar-parte-1-models#comment-1605</link>
    </item>
    <item>
      <title>"Como Testar parte 1 - Models" by Thiago</title>
      <description>&lt;p&gt;Parab&#233;ns pelo artigo e continue com a s&#233;rie, est&#225; sendo de grande valia.&lt;/p&gt;

&lt;p&gt;Me tira uma d&#250;vida, &#233; realmente interessante fazer testes que checam se a mensagem de erro &#233; igual a uma string? E se sobreescreverem a mensagem de erro da valida&#231;&#227;o, ou se utilizarem internacionaliza&#231;&#227;o?&lt;/p&gt;</description>
      <pubDate>Thu, 06 Nov 2008 16:57:00 -0200</pubDate>
      <guid isPermaLink="false">urn:uuid:0be7cde7-1518-4146-bdc1-9b3bf46d6249</guid>
      <link>http://blog.improveit.com.br/articles/2008/10/26/como-testar-parte-1-models#comment-1589</link>
    </item>
    <item>
      <title>"Como Testar parte 1 - Models" by Ramon Soares</title>
      <description>&lt;p&gt;Muito bom artigo.&lt;/p&gt;

&lt;p&gt;Mas tem um erro:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;VALIDS_MAIL = %w(&lt;a href="mailto:foo@bar.com" rel="nofollow"&gt;foo@bar.com&lt;/a&gt; &lt;a href="mailto:foo@bar.com.br" rel="nofollow"&gt;foo@bar.com.br&lt;/a&gt; &lt;a href="mailto:foo@globo.com" rel="nofollow"&gt;foo@globo.com&lt;/a&gt; foo@i_hate_the_microsoft.com foo@i_love_my_mac.com)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;n s&#227;o permitidos dom&#237;nios com _ (i&lt;em&gt;hate&lt;/em&gt;the&lt;em&gt;microsoft.com e/ou i&lt;/em&gt;love_my_mac.com). axo que uma melhor regex pra valida email seria: &lt;/p&gt;

&lt;p&gt;&lt;code&gt;/\A([^@\s]+)@((?:[-a-z0-9]+.)+[a-z]{2,})\Z/i&lt;/code&gt;&lt;/p&gt;</description>
      <pubDate>Thu, 06 Nov 2008 11:10:12 -0200</pubDate>
      <guid isPermaLink="false">urn:uuid:a212bff9-dfac-4225-854e-b4c8c21a17f1</guid>
      <link>http://blog.improveit.com.br/articles/2008/10/26/como-testar-parte-1-models#comment-1588</link>
    </item>
    <item>
      <title>"Como Testar parte 1 - Models" by Ricardo Almeida</title>
      <description>&lt;p&gt;Muito Bom Tapaj&#243;s! Parab&#233;ns.&lt;/p&gt;

&lt;p&gt;Voc&#234; est&#225; motivando bastante gente a estudar mais sobre testes.&lt;/p&gt;

&lt;p&gt;Eu tamb&#233;m tinha escutado sua entrevista no RailsBox e achei que foi uma verdadeira aula.&lt;/p&gt;

&lt;p&gt;Escrevi alguns posts no meu blog relativos a testes, mas n&#227;o foi nada t&#227;o pr&#225;tico como esse excelentente post.&lt;/p&gt;

&lt;p&gt;Valeu!&lt;/p&gt;</description>
      <pubDate>Thu, 30 Oct 2008 23:59:01 -0200</pubDate>
      <guid isPermaLink="false">urn:uuid:1d17f084-d3cc-4c61-91ff-d7ed4331861c</guid>
      <link>http://blog.improveit.com.br/articles/2008/10/26/como-testar-parte-1-models#comment-1573</link>
    </item>
    <item>
      <title>"Como Testar parte 1 - Models" by Lucas de Castro</title>
      <description>&lt;p&gt;Parab&#233;ns Tapaj&#243;s, &#243;timo post!&lt;/p&gt;</description>
      <pubDate>Thu, 30 Oct 2008 19:13:20 -0200</pubDate>
      <guid isPermaLink="false">urn:uuid:1b739e99-9b8a-46d1-9800-26b677006e61</guid>
      <link>http://blog.improveit.com.br/articles/2008/10/26/como-testar-parte-1-models#comment-1572</link>
    </item>
    <item>
      <title>"Como Testar parte 1 - Models" by Andressa</title>
      <description>&lt;p&gt;&#211;timo post! Concordo quando dizem que &#233; muito bom abordar este assunto, j&#225; percebi que muitas pessoas ainda n&#227;o entraram de verdade no mundo dos testes.&lt;/p&gt;

&lt;p&gt;Sobre a quest&#227;o de uma assertion por teste, discuti exatamente isso com minha orientadora de um projeto de pesquisa e o que ela me disse me convenceu:&lt;/p&gt;

&lt;p&gt;Imagine que voc&#234; possui uma aplica&#231;&#227;o grande, com v&#225;rios testes, sendo que para rodar todos voc&#234; gasta um tempo consider&#225;vel. Se h&#225; mais de uma assertion em cada teste (m&#233;todo) e se a primeira j&#225; falha, voc&#234; n&#227;o possui garantia nenhuma de que as outras assertions desse mesmo teste (m&#233;todo) est&#227;o corretas. Assim, se na primeira vez voc&#234; corrigiu 5 falhas, na pr&#243;xima vez voc&#234; teria que esperar todos os testes rodarem novamente e ainda correr o risco de surgir novas falhas que j&#225; poderiam ter sido identificadas anteriormente.&lt;/p&gt;

&lt;p&gt;Se h&#225; somente uma assertion por teste, voc&#234; consegue identificar logo na primeira "rodada" todas as falhas daqueles testes e pode corrig&#237;-las de uma vez.&lt;/p&gt;

&lt;p&gt;Bem, me convenceu. N&#227;o se se convence a voc&#234;s, rs. E desculpe se isso for &#243;bvio demais, rs. Estou iniciando nesse universo dos testes ainda! &lt;/p&gt;

&lt;p&gt;Parab&#233;ns e abra&#231;os!
^^&lt;/p&gt;</description>
      <pubDate>Wed, 29 Oct 2008 18:43:45 -0200</pubDate>
      <guid isPermaLink="false">urn:uuid:21cc97d1-4f09-473d-a2f2-149d9a04134d</guid>
      <link>http://blog.improveit.com.br/articles/2008/10/26/como-testar-parte-1-models#comment-1570</link>
    </item>
    <item>
      <title>"Como Testar parte 1 - Models" by Pedro Valentini</title>
      <description>&lt;p&gt;Legal o artigo, obrigado!
Exemplos pr&#225;ticos s&#227;o a melhor forma de aprender, ja li bastante sobre testes de software mas ainda n&#227;o fazem parte do meu dia-a-dia. Isso vai ser um incentivo, vou usar no Sociare =]
Abs,
Pedro&lt;/p&gt;</description>
      <pubDate>Tue, 28 Oct 2008 23:34:44 -0200</pubDate>
      <guid isPermaLink="false">urn:uuid:b297c2e9-e525-4204-b400-1b3b7e38ffc4</guid>
      <link>http://blog.improveit.com.br/articles/2008/10/26/como-testar-parte-1-models#comment-1569</link>
    </item>
    <item>
      <title>"Como Testar parte 1 - Models" by Lucas H&#250;ngaro</title>
      <description>&lt;p&gt;Tapaj&#243;s, d&#225; pra voc&#234; substituir todas as fixtures por factories (uso factory_girl pra isso) e manter os testes limpos.&lt;/p&gt;

&lt;p&gt;Manda bala nos posts porque, como eu disse anteriormente, pouco se fala sobre isso na comunidade.&lt;/p&gt;</description>
      <pubDate>Tue, 28 Oct 2008 11:04:22 -0200</pubDate>
      <guid isPermaLink="false">urn:uuid:0a54718a-d2bf-4661-9b22-5c9b9516961b</guid>
      <link>http://blog.improveit.com.br/articles/2008/10/26/como-testar-parte-1-models#comment-1568</link>
    </item>
    <item>
      <title>"Como Testar parte 1 - Models" by Carlos Brando</title>
      <description>&lt;p&gt;Eu confesso que o &#250;nico motivo de usar Shoulda ao inv&#233;s de RSpec s&#227;o as macros do Sholda. &lt;/p&gt;

&lt;p&gt;Mas eu sou um z&#233; man&#233; quando se fala de testes.&lt;/p&gt;

&lt;p&gt;Por favor, continue com esta s&#233;rie... tem muita coisa ainda que precisa ser dita.&lt;/p&gt;</description>
      <pubDate>Mon, 27 Oct 2008 18:59:01 -0200</pubDate>
      <guid isPermaLink="false">urn:uuid:8dad2c4a-1b81-4758-8951-3882646b40bd</guid>
      <link>http://blog.improveit.com.br/articles/2008/10/26/como-testar-parte-1-models#comment-1567</link>
    </item>
    <item>
      <title>"Como Testar parte 1 - Models" by Vin&#237;cius Manh&#227;es Teles</title>
      <description>&lt;p&gt;Bom trabalho, Tapa!!! :)&lt;/p&gt;

&lt;p&gt;N&#227;o p&#225;ra! N&#227;o p&#225;ra! N&#227;o p&#225;ra! N&#227;o p&#225;ra!&lt;/p&gt;

&lt;p&gt;Grande abra&#231;o, Vin&#237;cius.&lt;/p&gt;</description>
      <pubDate>Mon, 27 Oct 2008 18:32:19 -0200</pubDate>
      <guid isPermaLink="false">urn:uuid:3ca60249-dcd4-41a5-88c5-32f17804bc6b</guid>
      <link>http://blog.improveit.com.br/articles/2008/10/26/como-testar-parte-1-models#comment-1566</link>
    </item>
    <item>
      <title>"Como Testar parte 1 - Models" by Tapaj&#243;s</title>
      <description>&lt;p&gt;Ronaldo, esse &#233; o espirito, fomentar discuss&#245;es e levar ao aprendizado.&lt;/p&gt;

&lt;p&gt;Obrigado pelo seu feedback.&lt;/p&gt;</description>
      <pubDate>Mon, 27 Oct 2008 18:26:22 -0200</pubDate>
      <guid isPermaLink="false">urn:uuid:6daf8eab-6be9-4520-9c0b-46185fbe28b4</guid>
      <link>http://blog.improveit.com.br/articles/2008/10/26/como-testar-parte-1-models#comment-1565</link>
    </item>
    <item>
      <title>"Como Testar parte 1 - Models" by Tapaj&#243;s</title>
      <description>&lt;p&gt;Tim, d&#225; para fazer isso que voc&#234; citou em RSpec usando o Skinny Spec.&lt;/p&gt;</description>
      <pubDate>Mon, 27 Oct 2008 18:22:14 -0200</pubDate>
      <guid isPermaLink="false">urn:uuid:54ea5e8b-4f38-4882-b49a-e757e5b15dd9</guid>
      <link>http://blog.improveit.com.br/articles/2008/10/26/como-testar-parte-1-models#comment-1564</link>
    </item>
    <item>
      <title>"Como Testar parte 1 - Models" by Tapaj&#243;s</title>
      <description>&lt;p&gt;Carlos, eu s&#243; conhe&#231;o um desses projetos que &#233; o &lt;a href="http://github.com/rsl/skinny_spec" rel="nofollow"&gt;Skinny Spec&lt;/a&gt;. Tenho usado ele em uns projetos l&#225; na Surgeworks e no geral estou satisfeito.&lt;/p&gt;

&lt;p&gt;Algumas coisas eu mesmo implemento no meu spec_helper e depois reuso.&lt;/p&gt;

&lt;p&gt;Por quest&#245;es de did&#225;tica preferi n&#227;o cita-los pois queria mostrar como testar mesmo. Mostrar como as coisas funcionam ao inv&#233;s de mostrar apenas chamadas que ningu&#233;m sabe como funcionam. &lt;/p&gt;

&lt;p&gt;Para n&#243;s que j&#225; temos experi&#234;ncia no assunto meus testes podem parecer bem tolos, mas a id&#233;ia desse post &#233; ajudar quem conhece muito pouco de testes.&lt;/p&gt;

&lt;p&gt;Acho que eu n&#227;o precisaria escrever um artigo de testes voltado aos experts em testes pois com certeza sou eu que tenho que aprender com eles.&lt;/p&gt;</description>
      <pubDate>Mon, 27 Oct 2008 18:21:16 -0200</pubDate>
      <guid isPermaLink="false">urn:uuid:53fea0b4-a1fb-4922-a85a-36e4b9fa5676</guid>
      <link>http://blog.improveit.com.br/articles/2008/10/26/como-testar-parte-1-models#comment-1563</link>
    </item>
    <item>
      <title>"Como Testar parte 1 - Models" by Tapaj&#243;s</title>
      <description>&lt;p&gt;Lucas, seu coment&#225;rio n&#227;o foi moderado. Pode ser que o nosso sistema de blog tenha marcado como spam e algu&#233;m foi l&#225; e marcou como confiavel, pois est&#225; aparecendo aqui.&lt;/p&gt;

&lt;p&gt;N&#227;o vou te levar a mal, &#233; discutindo que se aprende. N&#227;o existe forma melhor de aprender do que tentar ensinar algo para algu&#233;m. Tinha certeza que iniciando essa s&#233;rie eu ia come&#231;ar a aprender v&#225;rias coisas.&lt;/p&gt;

&lt;p&gt;Tudo que eu fa&#231;o com RSpec eu posso fazer com o Shoulda e realmente tem muito teste tosco com RSpec.&lt;/p&gt;

&lt;p&gt;Na verdade o que me faz gostar mais do RSpec &#233; que ele &#233; focado em comportamento, sua sintaxe foi criada para isso e cria meio que uma implica&#231;&#227;o impl&#237;cita. &lt;/p&gt;

&lt;p&gt;Na minha opini&#227;o s&#227;o vis&#245;es diferentes. Mas veja bem, eu prefiro o RSpec mas isso n&#227;o quer dizer que um seja melhor ou pior do que o outro. Indo mais al&#233;m, n&#227;o quer dizer que "BDD" &#233; RSpec e Shoulda "TDD". Acho que nisso nos concordamos. Certo?&lt;/p&gt;

&lt;p&gt;Claro que nisso tudo entra a quest&#227;o de gosto e de opini&#245;es pessoais.&lt;/p&gt;

&lt;p&gt;Com rela&#231;&#227;o ao meu teste de named_scope eu concordo com voc&#234; que ele n&#227;o testa comportamento s&#243; que eu prefiri fazer dessa forma para n&#227;o usar fixtures e al&#233;m disso eu queria mostrar o proxy.&lt;/p&gt;

&lt;p&gt;Eu n&#227;o gosto de usar fixtures para esse tipo de teste mesmo que eu precise sacrificar um pouco o teste de comportamento.&lt;/p&gt;</description>
      <pubDate>Mon, 27 Oct 2008 18:13:03 -0200</pubDate>
      <guid isPermaLink="false">urn:uuid:d4ed36a0-5315-424e-8401-4994995c2fcc</guid>
      <link>http://blog.improveit.com.br/articles/2008/10/26/como-testar-parte-1-models#comment-1562</link>
    </item>
    <item>
      <title>"Como Testar parte 1 - Models" by Tapaj&#243;s</title>
      <description>&lt;p&gt;Akita, eu tenho usado o "Factory Girl" e estou gostando. O outro eu nunca usei.&lt;/p&gt;

&lt;p&gt;Pretendo escrever s&#243; sobre o "Factory Girl". Aguarde e confie! :-)&lt;/p&gt;</description>
      <pubDate>Mon, 27 Oct 2008 17:55:10 -0200</pubDate>
      <guid isPermaLink="false">urn:uuid:bd2c9940-a994-4bcc-a142-358d9f3a315a</guid>
      <link>http://blog.improveit.com.br/articles/2008/10/26/como-testar-parte-1-models#comment-1561</link>
    </item>
    <item>
      <title>"Como Testar parte 1 - Models" by Ronaldo Ferraz</title>
      <description>&lt;p&gt;Elomar, sobre a quest&#227;o de fixtures em testes unit&#225;rios, existem benef&#237;cios e problemas. Fixtures podem tornar os seus testes unit&#225;rios mais quebradi&#231;os, mas podem tamb&#233;m torn&#225;-los mais reais. N&#227;o usar fixtures pode rapidamente levar &#224; necessidade de testes como o de has_many acima que, embora v&#225;lido em um certo sentido, est&#225; testando a declara&#231;&#227;o e n&#227;o o comportamento.&lt;/p&gt;

&lt;p&gt;Brando, sobre as macros do Shoulda, eu tendo a evit&#225;-las em muitos aspectos justamente porque tamb&#233;m tendem a testar declara&#231;&#245;es e n&#227;o comportamento. Especialmente as que envolvem o Rails vivem sendo v&#237;timas de discuss&#245;es por essa caracter&#237;stica. O should_be_restful &#233; um exemplo desse, que foi removido justamente pela opacidade. Muitos das macros envolvem esse tipo de problema e n&#227;o refletem o mesmo comportamento dos matchers do RSpec. Dito isso, ultimamente meus testes tem sido Shoulda + RR.&lt;/p&gt;

&lt;p&gt;Tapaj&#243;s, sobre indu&#231;&#227;o de forma, tendo a discordar j&#225; que se o teste parte de arquitetura, comportamente sa&#237; naturalmente. Dito, isso, obrigado por instigar a discuss&#227;o. O texto e os coment&#225;rios est&#227;o se relevando bem instrutivos para a comunidade.&lt;/p&gt;</description>
      <pubDate>Mon, 27 Oct 2008 14:24:57 -0200</pubDate>
      <guid isPermaLink="false">urn:uuid:55ca2776-7569-417e-af4c-fd4fbfc738c4</guid>
      <link>http://blog.improveit.com.br/articles/2008/10/26/como-testar-parte-1-models#comment-1560</link>
    </item>
    <item>
      <title>"Como Testar parte 1 - Models" by Tim Case</title>
      <description>&lt;p&gt;J&#225; trabalhei com test unit e rspec muito, e eu prefiero shoulda.  &lt;/p&gt;

&lt;p&gt;olha:&lt;/p&gt;

&lt;p&gt;should&lt;em&gt;require&lt;/em&gt;attributes :name
should&lt;em&gt;have&lt;/em&gt;many :accounts&lt;/p&gt;</description>
      <pubDate>Mon, 27 Oct 2008 14:19:47 -0200</pubDate>
      <guid isPermaLink="false">urn:uuid:7c0139c8-f0cd-4e2d-aaec-fc22843271f7</guid>
      <link>http://blog.improveit.com.br/articles/2008/10/26/como-testar-parte-1-models#comment-1559</link>
    </item>
    <item>
      <title>"Como Testar parte 1 - Models" by Carlos Brando</title>
      <description>&lt;p&gt;Voc&#234; n&#227;o usa Shoulda, ok, ok... mas voc&#234; usa algum matcher para evitar ficar repetindo c&#243;digos nos testes com o RSpec? &lt;/p&gt;

&lt;p&gt;Todos os testes que voc&#234; fez acima seriam umas 5 linhas com Shoulda, por exemplo. Eu sei que existem projetos como o rspec-on-rails-matchers para o RSpec que fazem o mesmo. Mas a pergunta &#233;: Voc&#234; usa? Recomenda? Qual a sua opini&#227;o sobre isto?&lt;/p&gt;</description>
      <pubDate>Mon, 27 Oct 2008 13:31:38 -0200</pubDate>
      <guid isPermaLink="false">urn:uuid:9144a2a2-9dc6-42a2-aef4-b5950599a3cb</guid>
      <link>http://blog.improveit.com.br/articles/2008/10/26/como-testar-parte-1-models#comment-1558</link>
    </item>
    <item>
      <title>"Como Testar parte 1 - Models" by Lucas H&#250;ngaro</title>
      <description>&lt;p&gt;&#201; hoje hein... eu devia ter dormido direito.&lt;/p&gt;

&lt;p&gt;Discuti = Discute&lt;/p&gt;

&lt;p&gt;Ali&#225;s, meu primeiro coment&#225;rio, onde cometi o abomin&#225;vel erro de escrever "casso" n&#227;o apareceu. Ele foi moderado?&lt;/p&gt;</description>
      <pubDate>Mon, 27 Oct 2008 12:18:08 -0200</pubDate>
      <guid isPermaLink="false">urn:uuid:211530ab-d863-4417-a168-99f460d50ff9</guid>
      <link>http://blog.improveit.com.br/articles/2008/10/26/como-testar-parte-1-models#comment-1557</link>
    </item>
    <item>
      <title>"Como Testar parte 1 - Models" by Lucas H&#250;ngaro</title>
      <description>&lt;p&gt;N&#227;o. :)&lt;/p&gt;

&lt;p&gt;(N&#227;o me leve a mal, por favor. Sempre achei que temos que discutir mais sobre testes na comunidade... todo mundo fala que faz, mas ningu&#233;m comenta, discuti, passa o conhecimento etc).&lt;/p&gt;

&lt;p&gt;O que voc&#234; faz com RSpec que n&#227;o faz com Shoulda, expectations e outros?&lt;/p&gt;

&lt;p&gt;Testar o comportamento n&#227;o depende do framework. J&#225; vi muito teste bem feito, que assegura o comportamento, feito com Test::Unit e muito, mas muito mesmo, teste porco com RSpec.&lt;/p&gt;</description>
      <pubDate>Mon, 27 Oct 2008 12:14:58 -0200</pubDate>
      <guid isPermaLink="false">urn:uuid:2a43f2da-8bb8-4605-a85a-1eb48dcd9725</guid>
      <link>http://blog.improveit.com.br/articles/2008/10/26/como-testar-parte-1-models#comment-1556</link>
    </item>
    <item>
      <title>"Como Testar parte 1 - Models" by Tapaj&#243;s</title>
      <description>&lt;p&gt;Lucas, com certeza voc&#234; pode escrever testes de comportamento com o Shoulda assim como o inverso com o RSpec. &lt;/p&gt;

&lt;p&gt;Acredito que a estrutura do framework de teste te induz a fazer de uma forma no RSpec e de outra no Shoulda.&lt;/p&gt;

&lt;p&gt;Ser&#225; que consegui me fazer claro?&lt;/p&gt;</description>
      <pubDate>Mon, 27 Oct 2008 12:05:22 -0200</pubDate>
      <guid isPermaLink="false">urn:uuid:9c27b1d0-75fd-419d-afe7-9ca37bb368ca</guid>
      <link>http://blog.improveit.com.br/articles/2008/10/26/como-testar-parte-1-models#comment-1555</link>
    </item>
    <item>
      <title>"Como Testar parte 1 - Models" by Lucas H&#250;ngaro</title>
      <description>&lt;p&gt;Tapaj&#243;s disse: "N&#227;o gosto do Shoulda pois ele tenta imitar um BDD sem ser."&lt;/p&gt;

&lt;p&gt;Cuidado, cuidado. Usar RSpec (ou Expectations, ou whatever...) n&#227;o quer dizer que voc&#234; faz BDD automaticamente. Isso n&#227;o existe.&lt;/p&gt;

&lt;p&gt;Nos exemplos do post mesmo, o teste do named&lt;em&gt;scope utilizando proxy&lt;/em&gt;options &#233; um excelente exemplo de como testar estado com uma DSL feita para testar comportamento.&lt;/p&gt;</description>
      <pubDate>Mon, 27 Oct 2008 11:59:44 -0200</pubDate>
      <guid isPermaLink="false">urn:uuid:305bd5eb-1e70-4e51-a991-22910864ba79</guid>
      <link>http://blog.improveit.com.br/articles/2008/10/26/como-testar-parte-1-models#comment-1554</link>
    </item>
  </channel>
</rss>
