Factory_bot: Quand exécuter `FactoryGirl.lint`

Créé le 17 avr. 2015  ·  4Commentaires  ·  Source: thoughtbot/factory_bot

Le README dit :

L'utilisation recommandée de FactoryGirl.lint est de l'appeler une fois avant l'exécution de la suite de tests.

Mais cela n'implique-t-il pas que même lors de l'exécution d'un seul test, par exemple dans le cadre de TDD, chaque usine sera linturée, provoquant un ralentissement dramatique ?

Commentaire le plus utile

D'accord. Le ralentissement a été brutalement douloureux lorsqu'il a été invoqué de la manière décrite ici .

Ce n'est pas idéal, mais nous avons fini par créer un fichier lint_spec qui ne sert qu'à invoquer FactoryGirl.lint .

# spec/lint_spec.rb

require "rails_helper"

RSpec.describe "Lint" do
  it "FactoryGirl" do
    FactoryGirl.lint
  end
end

Tous les 4 commentaires

D'accord. Le ralentissement a été brutalement douloureux lorsqu'il a été invoqué de la manière décrite ici .

Ce n'est pas idéal, mais nous avons fini par créer un fichier lint_spec qui ne sert qu'à invoquer FactoryGirl.lint .

# spec/lint_spec.rb

require "rails_helper"

RSpec.describe "Lint" do
  it "FactoryGirl" do
    FactoryGirl.lint
  end
end

Vous avez raison @andyw8. Nous avons en fait supprimé cette même utilisation des bretelles ici : https://github.com/thoughtbot/suspenders/commit/0dbbc626e5da9f6ee94e1226487b4017cd2b8099 en raison du même problème.

Je vais ouvrir un PR pour mettre à jour la documentation et recommander de l'exécuter dans une tâche distincte.

J'ai modifié un peu l'exemple de tâche de râteau que vous donnez pour autoriser le linting uniquement dans des usines spécifiques.

# lib/tasks/factory_girl.rake
namespace :factory_girl do
  desc 'Verify that FactoryGirl factories are valid'
  task :lint, [:path] => :environment do |t, args|
    if Rails.env.test?
      begin
        DatabaseCleaner.start
        if args.path.present?
          factories = FactoryGirl.factories.select do |factory|
            factory.name.to_s =~ /#{args.path[0]}/
          end
          FactoryGirl.lint factories
        else
          FactoryGirl.lint
        end
      ensure
        DatabaseCleaner.clean
      end
    else
      system("bundle exec rake factory_girl:lint RAILS_ENV='test'")
    end
  end
end

Il est particulièrement utile avec le râteau de garde pour surveiller les usines et uniquement celles qui changent.

# Guardfile
guard :rake, task: 'factory_girl:lint' do
  watch(%r{^spec/factories/(.+)s.rb$}) { |m| "#{m[1]}" }
end

Cet exemple suppose que toutes les usines héritées du fichier contiennent leur nom parent dans le leur (_par exemple_ utilisateur, utilisateur_avec_contacts, super_utilisateur, etc.).

Pourrait être amélioré en utilisant l'attribut @Parent des instances factorygirl je suppose.

FWIW : la documentation pour le linting a maintenant un exemple similaire d'une tâche de râteau.

Cette page vous a été utile?
0 / 5 - 0 notes