<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>lucasfais.com &#187; rails</title>
	<atom:link href="http://lucasfais.com/category/ruby/rails/feed/" rel="self" type="application/rss+xml" />
	<link>http://lucasfais.com</link>
	<description></description>
	<lastBuildDate>Fri, 05 Mar 2010 16:20:33 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Testando aplicações Rails com Shoulda e factory_girl</title>
		<link>http://lucasfais.com/2008/10/06/testando-aplicacoes-rails-com-shoulda-e-factory_girl/</link>
		<comments>http://lucasfais.com/2008/10/06/testando-aplicacoes-rails-com-shoulda-e-factory_girl/#comments</comments>
		<pubDate>Mon, 06 Oct 2008 21:58:14 +0000</pubDate>
		<dc:creator>Lucas Fais</dc:creator>
				<category><![CDATA[rails]]></category>
		<category><![CDATA[factory_girl]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[shoulda]]></category>
		<category><![CDATA[test]]></category>
		<category><![CDATA[unit]]></category>

		<guid isPermaLink="false">http://lucasfais.com/?p=21</guid>
		<description><![CDATA[No meu primeiro artigo, vou mostrar como testar aplicações Rails de forma simples utilizando Shoulda e factory_girl. Esta é apenas uma introdução, um &#8220;por onde começar&#8230;&#8221;.
Se você não gosta de fixtures, acha o Test:Unit muito básico ou nunca fez testes com aplicações em Rails: Este artigo foi feito sob medida pra você!
Shoulda é um plugin/gem [...]]]></description>
			<content:encoded><![CDATA[<p>No meu primeiro artigo, vou mostrar como testar aplicações Rails de forma simples utilizando <a href="http://www.thoughtbot.com/projects/shoulda">Shoulda</a> e <a href="http://www.thoughtbot.com/projects/factory_girl">factory_girl</a>. Esta é apenas uma introdução, um &#8220;por onde começar&#8230;&#8221;.</p>
<p>Se você não gosta de fixtures, acha o <em>Test:Unit</em> muito básico ou <strong>nunca fez testes</strong> com aplicações em Rails:<strong> Este artigo foi feito sob medida pra você!</strong></p>
<p><a href="http://www.thoughtbot.com/projects/shoulda">Shoulda</a> é um plugin/gem que adiciona alguns recursos poderosos ao conhecido <em>Test::Unit</em>. Com ele, faremos mais testes com menos linhas de código.</p>
<p><a href="http://www.thoughtbot.com/projects/factory_girl">factory_girl</a> é uma <em>gem</em> que facilita a criação de dados para testes. Aos invés de usarmos as antigas <em>fixtures</em>, usaremos algo, digamos, mais &#8220;sexy&#8221;, como a comunidade gosta de chamar.</p>
<p>Vamos direto a prática. O meu ambiente está configurado com Rails 2.1.1.</p>
<p>Crie uma aplicação Rails. Aqui estou usando MySQL:</p>
<pre class="terminal">$ rails my_cash -d mysql
$ cd my_cash/</pre>
<p>Agora instale o plugin do Shoulda. Você também pode optar por usar a gem. No meu caso, prefiro adicioná-lo ao projeto:</p>
<pre class="terminal">$ script/plugin install git://github.com/thoughtbot/shoulda.git</pre>
<p>Neste exemplo, vou criar uma aplicação bem simples para controlar gastos pessoais. Nela, poderei cadastrar minhas despesas e receitas (que chamarei de operações).</p>
<p>Gere um <em>scaffold</em> para o model operação:</p>
<pre class="terminal">$ ./script/generate scaffold Operation description:string category:string value:float</pre>
<p>Edite o arquivo config/database.yml e configure o seu banco de dados.<br />
Após isso, crie todos os databases:</p>
<pre class="terminal">$ rake db:create:all</pre>
<p>Agora execute um db:migrate para criar as tabelas no database development:</p>
<pre class="terminal">$ rake db:migrate</pre>
<p>Se tudo correu bem até aqui, você pode iniciar sua aplicação e conferir se tudo está funcionando corretamente:</p>
<pre class="terminal">$ ./script/server</pre>
<p>Acesse <a href="http://localhost:3000/operations">http://localhost:3000/operations</a> e adicione algumas operações. Vamos considerar que uma operação de valor positivo é uma receita, e valor negativo é despesa.</p>
<p>Você terá algo, mais ou menos, assim:</p>
<div id="attachment_42" class="wp-caption alignnone" style="width: 510px"><a href="http://lucasfais.com/wp-content/uploads/2008/10/operations.png"><img class="size-full wp-image-42" title="operations" src="http://lucasfais.com/wp-content/uploads/2008/10/operations.png" alt="Exemplo de operações" width="500" height="300" /></a><p class="wp-caption-text">Exemplo de operações</p></div>
<p>Vamos os testes!<br />
Edite o arquivo test/unit/operation_test.rb.</p>
<p>Uma operação deve ter, pelo menos, descrição e valor preenchidos. Para fazermos este teste utilizaremos uma macro adicionada pelo Shoulda chamada should_require_attributes:<br />
<script src="http://gist.github.com/13471.js" type="text/javascript"></script></p>
<p>Você pode rodar os testes:</p>
<pre class="terminal">$ rake test:units</pre>
<p>Eles vão falhar e você receberá uma mensagem, mais ou menos, assim:</p>
<pre class="terminal">1) Failure:
test: Operation should require description to be set. (OperationTest)
...
Operation allowed nil as a value for description.
...
2) Failure:
test: Operation should require value to be set. (OperationTest)
...
Operation allowed nil as a value for description.
...
2 tests, 2 assertions, 2 failures, 0 errors</pre>
<p>Os testes falharam porque ainda não colocamos no nosso <em>model</em> as validações necessárias. Mas veja que interessante. Temos mensagens bastante descritivas sobre os nossos testes:</p>
<p><strong>&#8220;Operation should require description to be set. Operation allowed nil as a value for description&#8221;.</strong></p>
<p>Está aí um dos grandes pontos fortes do Shoulda. Conseguimos fazer nossos testes ficarem bem próximos de uma especificação. Veremos mais sobre isso adiante.</p>
<p>Vamos editar o arquivo do app/models/operation.rb e adicionar as validações necessárias para evitar que o teste falhe: <script src="http://gist.github.com/13472.js" type="text/javascript"></script></p>
<p>Rode os testes novamente (<strong>rake test:units</strong>) e veja nosso novo resultado:</p>
<pre class="terminal">...
2 tests, 6 assertions, 0 failures, 0 errors</pre>
<p>Repare que “por baixo dos panos” o Shoulda criou 2 testes e 6 asserções para garantir que o os nosso model valida a presença dos atributos description e value. Tudo isso com apenas uma linha de código!</p>
<p>Shoulda tem várias macros como a que usamos em nossos testes. Elas tornam nossas classes de teste muito mais enxutas. Para conhecê-las acesse o <a href="http://www.thoughtbot.com/projects/shoulda">site do Shoulda</a>.</p>
<p>Antes de prosseguirmos com nossos testes com o Shoulda, vamos configurar o factory_girl. A partir de agora, precisaremos de alguns objetos <em>Operation</em>.</p>
<p>Instale a gem do factory_girl (como estou no Ubuntu, vou utilizar o <strong>sudo</strong> pra isso):</p>
<pre class="terminal">$ sudo gem install thoughtbot-factory_girl --source http://gems.github.com</pre>
<p>Agora precisamos informar ao Rails que nossa aplicação depende da gem factory_girl.<br />
Para isso, adicione a seguinte linha ao arquivo config/enviroment.rb, dentro do bloco <em>Rails::Initializer.run</em>:<br />
<script src="http://gist.github.com/14754.js" type="text/javascript"></script></p>
<p>Edite o arquivo test/test_helper.rb e comente a linha abaixo para desabilitar o uso de fixtures:<br />
 <script src="http://gist.github.com/14755.js" type="text/javascript"></script></p>
<p>Caso você tenha um projeto que utiliza <em>fixtures</em> e você não quer migrá-lo completamente para factory_girl, não comente a linha acima. Acredito que <em>fixtures</em> e <em>factories</em> podem trabalhar juntas sem problemas.</p>
<p>Crie o arquivo test/factories.rb e adicione o seguinte conteúdo:<br />
<script src="http://gist.github.com/14757.js" type="text/javascript"></script></p>
<p>Neste arquivo, nós definimos nossos objetos que poderemos usar nos nossos testes.</p>
<p>Agora sim. Com o factory_girl configurado e alguns objetos Operation já definidos, podemos prosseguir.<br />
 Edite o arquivo test/unit/operation_test.rb e insira os seguintes métodos:<br />
 <script src="http://gist.github.com/14758.js" type="text/javascript"></script></p>
<p>Nos dois primeiros métodos, estou apenas testando o retorno do valor da primeira operação, e a categoria da segunda operação. Nos dois últimos, estou testando se a operação é uma receita ou uma despesa.</p>
<p>Veja que em cada método estou recuperando um objeto da nossa <em>Factory</em> e fazendo um <em>assert</em>. Como eu disse no início, o Shoulda apenas adiciona funcionalidades ao <em>Test:Unit</em>. Mesmo assim, você ainda pode usar os recursos padrões.</p>
<p>Para que os testes funcionem, adicione os seguintes métodos no model <em>Operation</em> (app/models/operation.rb):<br />
<script src="http://gist.github.com/14759.js" type="text/javascript"></script></p>
<p>Rode os testes (<strong>rake test:units</strong>) e terá o seguinte resultado:</p>
<pre class="terminal">6 tests, 10 assertions, 0 failures, 0 errors</pre>
<h3><strong>Contextos</strong></h3>
<p>Contexto é um recurso muito interessante do Shoulda. Com ele podemos especificar situações e tornar os testes mais legíveis. Continue lendo, você já vai entender e gostar muito.</p>
<p>Vou fazer um pequeno refactoring nos nossos testes. Leia o código abaixo com calma: <script src="http://gist.github.com/14761.js" type="text/javascript"></script></p>
<p>Repare como eu especifiquei situações (contextos) que fazem meus testes serem lidos de uma forma bastante lógica.</p>
<p>Se você simular um erro você receberá uma mensagem parecida com essa:</p>
<pre class="terminal">1) Failure:

test: A valid operation with value less than zero should be expense. (OperationTest)
...</pre>
<p>Viu como tudo fica claro? Ficará melhor ainda.</p>
<p>Um dos recursos que mais gosto no Shoulda é a tarefa shoulda:list que ele adiciona ao rake. Execute:</p>
<pre class="terminal">$ rake shoulda:list</pre>
<p>Você terá um retorno assim:</p>
<pre class="terminal">Operation
  A valid operation should require description to be set.
  A valid operation should require value to be set.
  A valid operation should return its category.
  A valid operation should return its value.
  A valid operation with value greater than zero should be income.
  A valid operation with value less than zero should be expense.
OperationsController
  test_should_create_operation
  test_should_destroy_operation
  test_should_get_edit
  test_should_get_index
  test_should_get_new
  test_should_show_operation
  test_should_update_operation</pre>
<p>Nos testes do model <em>Operation</em> estamos usando Shoulda. Olhe como as mensagens estão muito legíveis!<br />
Nos testes do <em>OperationController</em> estão testes padrões, gerados pelo scaffold, utilizando apenas <em>Test:Unit</em>. Notam a diferença?</p>
<p>Você também pode testar seus controllers utilizando o Shoulda. Leia mais <a href="http://thoughtbot.com/projects/shoulda/tutorial/controllers">aqui</a>.</p>
<p>Testes com a Shoulda você pode imprimir e conferir junto ao seu cliente. Fica tudo muito claro.</p>
<p>Com o conteúdo apresentado aqui, você já pode testar grande parte das aplicações.<br />
Mas esta foi apenas uma introdução do que é possível fazer com Shoulda e factory_girl. </p>
<p>Encontre mais informações nos seguintes links:</p>
<ul>
<li><a href="http://thoughtbot.com/projects/shoulda/">Shoulda</a></li>
<li><a href="http://www.thoughtbot.com/projects/factory_girl/">factory_girl</a></li>
<li><a href="http://www.makemesimple.com/blog/2008/06/27/learncast1-bdd-leve-com-shoulda-testando-modelos-activerecord/">Learncast #1: BDD leve com Shoulda &#8211; testando modelos ActiveRecord</a></li>
<li><a href="http://www.nomedojogo.com/2008/10/01/shoulda-20/">Shoulda 2.0</a></li>
</ul>
<p>Fiquem à vontade para enviar dúvidas, críticas e sugestões.</p>
]]></content:encoded>
			<wfw:commentRss>http://lucasfais.com/2008/10/06/testando-aplicacoes-rails-com-shoulda-e-factory_girl/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>
