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 ?
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.
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'à invoquerFactoryGirl.lint
.