Ceará On Rails 2009 - Vou Participar Art Of Community

Comentários: (3)

Usando Factory Girl em seus testes

Categoria : Fixtures, Ruby

Hoje quem desenvolve em Ruby On Rails tem nas mãos as poderosas ferramentas de testes, sejam eles para desenvolvimento orientado a testes ou orientado a comportamentos. E no início nós usávamos fixtures, que são arquivos que contém um amontoado de dados que serão usados em nossos testes.

Junto com a evolução dessas ferramentas nasceram os fixtures replacements. Nasceram para suprir a necessidade de organização e praticidade na utilização de fixtures. Atualmente temos Machinist, Factory Girl, Object Daddy, Dataset, Fixjour e FixtureReplacement. Certamente existem outros, mas esses são os mais famosos e usados.

Hoje vou mostrar como você pode usar o Factory Girl em seus testes/especificações.

Para instalar o Factory Girl:

sudo gem install thoughtbot-factory_girl

Depois você tem que configurar no seu environment o uso da gem:

config.gem “thoughtbot-factory_girl”, :lib => “factory_girl”, :source => “http://gems.github.com”

Depois de configurado, vamos a criação de suas factories. Por padrão, o Factory Girl carrega automaticamente em seus testes as factories que se encontram em test/factories/*.rb, spec/factories/*.rb ou você pode criar todos os seus factories em um único arquivo e colocar em test/factories.rb ou spec/factories.rb. Você pode criar todos os seus factories em um único arquivo ou separar por model (O que eu acho mais organizado).

Antes de usar o Factory Girl nos seus testes você deve definir como cada model deve funcionar:

Factory.define :user do |factory|
  factory.name => "Cairo"
  factory.surname => "Noleto"
end

Você pode ter outras definições, por exemplo:

Factory.define :admin, :class => User do |factory|
  factory.name => "Administrador"
  factory.surname => "Cairo Noleto"
  factory.admin => true
end

Você pode fazer vários tipos de factories, um para cada situação que você precisar, é mais fácil para fazer a manutenção.

Depois que você define suas factories é hora de realmente brincar com elas ;)

user = Factory.build(:user)
user_admin = Factory.build(:admin)

Quando você usa build, ele constroi um objeto não salvo.

user = Factory.create(:user)
user_admin = Factory.create(:admin)

Ao utilizar create, você está criando um objeto salvo.

Você pode criar uma hash com os atributos:

admin_attributes = Factory.attributes_for(:admin)

Você pode definir associações:

Factory.define :picture do |factory|
  factory.name "Random name"
  factory.association :user, :factory => :user
end

Basicamente o Factory Girl é isso, dessa forma você já pode abandonar as fixtures. Existe mais opções de uso do Factory Girl que você pode olhar a documentação oficial.

Comentários (3)

Ei Cairo inclui ai nesse tutorial, como faz pra gerar vários objetos dessas fabricas onde não podem se repetir… pra complementar…

Sim, duvidas… digamos eu tenho um relacionamento Users e Rights, onde os cada usuário tem o seu tipo de permissão [controller => action], ok? Como criar uma fábrica gerar esse tipo de relacionamento? Porque não terá dados aleatórios, terá dados fixos e dependendo do grupo de usuário ele terá as suas permissões como criar essa fábrica para testar?

Você pode usar o faker, uma gem que gera dados aleatórios. Eu vou explicar mais ela quando eu for falar do Machinist.

Mas são dados aleatórios que são existentes, porque quando eu for fazer um teste de view com cucumber+selenium, eu preciso ter as permissões de ações dos controllers que eu for acessar. Dai queria saber qual melhor uso para isso, eu fiz uma implementação mas não sei se é a melhor. Dai queria saber outras opções de como usar/implementar no meu projetinho!
Grato.

Poste um comentário