Je viens d'ajouter des validations pour une image de porteur d'un modèle à un modèle et les tests actuels sont vraiment lents. Comment puis-je accélérer ce processus? Je me sens comme s'il doit y avoir une meilleure façon. Strong> Je cours sans validations et que vous pourrez utiliser mes tests RSPEC dans environ 140 secondes, mais depuis que je validai maintenant la présence de la présence de Voici comment la page Carrierwave Github recommande de configurer Factory Girl: P> : display_pic code> J'ai dû ajouter des téléchargements de fichiers réels à mon usine de projet. Cela l'a augmenté à 240 secondes! 140 était déjà du côté lourd, c'est juste fou. P>
CarrierWave.configure do |config|
config.storage = :file
config.enable_processing = false
end
5 Réponses :
Vos téléchargements sont-ils stockés localement ou allez-ils dans un service de nuage comme S3? Si ce dernier, c'est probablement ce qui tue vos performances de test.
Pour les tests, c'est toujours une bonne pratique de se moquer de dépendances externes. Si tel est votre problème, vous devez utiliser un outil pour se moquer de la connexion. Je pense que le GEM de brouillard est livré avec prise en charge intégrée pour cela. P>
mise à jour : concernant la réponse de Jefferson girao , j'ai utilisé un tour pour éviter d'ouvrir un fichier de test et à l'aide de StringIO pour simuler Tests des fichiers à des fins d'usine. Cela fonctionne mieux car il évite l'accès du disque: P>
def test_file_stream(filename = 'test.jpg', mime_type='image/jpg', content = '') StringIO.new(content).tap do |s| s.content_type = mime_type s.original_filename = filename end end
Oui merci, ceci est déjà fait config.storage =: fichier code> dans la conduite d'onde de support Configurer les forces du bloc qui, en production, il est défini sur le brouillard
Intéressant. Je suis hors de suppositions alors. Désolé.
Cela s'est produit (les 140 secondes de différence) B / C comme fille d'usine l'évalue paresseusement, il n'a jamais été exécuté avant. Maintenant, comme vous avez la validation exécutée, l'attribut sera toujours accepté.
Merci pour cela, c'est fantastique!
Cela n'a pas fonctionné pour moi. StringIO n'a ni un "content_type" ni un attribut "original_filename".
@Pablomarambio - Je pense que PaperClip les mélange dans.
Avec la validation qui se produit maintenant, une instance est créée l'attribut Display_pic est accessible et le code à l'intérieur des crochets
FactoryGirl.define do factory :project do display_pic { File.open(File.join(Rails.root, 'spec', 'support', 'projects', 'display_pics', 'test.jpg')) } to_create do |instance| instance.save!(:validate => false) end end end
Je préférerais ne pas contourner les validations. Dans PaperClip, vous pouvez remplir le champ Pic avec une chaîne, j'espérais quelque chose sur ces lignes.
Merci pour la réponse, je comprends que cela est logique qu'il faudrait plus de temps à charger, la durée de charge est toutefois trop à des fins de test, dans l'espoir d'un moyen de le minimiser.
C'est la meilleure solution que j'ai vue si loin et ça marche, merci
Mon mauvais, j'étais MIA quand la généraliste a expiré, à moins que quelqu'un ne propose un moyen de se moquer de maroger les téléchargements de fichiers avec Carrierwave malade, passez simplement à vous 100 à vous.
Vous avez probablement envisagé cela déjà, mais le ralentissement de 100 secondes est-il lié à un téléchargement de fichier em> em>? Si c'est un agrégat sur tous les tests, il doit y avoir un moyen de les structurer de manière à ce que vous ayez un seul test (ou quelques-uns) qui valident la présence du fichier et le reste du temps que vous vous moquez de vous moquer. p>
Souhaitez-vous suggérer quelque chose de différent de Jefferson Girao ou d'accord avec cela?
Je viens de frapper ce problème, cela peut aider à le résoudre en stockant le fichier en mémoire plutôt que de laisser l'usine lire l'image à partir de disque à chaque test. J'utilise quelque chose comme ce qui suit. Je pense avoir économisé environ 10% de temps sur ma suite de tests, mais ma suite de test est une variable silencieuse, donc je ne peux pas être absolument sûr. Quoi qu'il en soit, juste quelque chose à considérer si quelqu'un frappe cette question. P> Je n'aime pas vraiment la solution qui vous oblige à ne pas valider le modèle. Je suppose que cela ressemble à la réponse Stringio de Wolfram Arnold, bien que je pense que cette façon est un peu plus facile à comprendre. P> p>
avec inspiration de @jeffersongirao et @ wolfram arnold : deux éléments clés ici: p> Les Setteurs de téléchargement de Carrierwave peuvent donner un sens à un tas de choses. Ils le font en enveloppant ce qu'ils entrent dans un
Carrierwave :: Sanitizéfile Code>. Une des choses qu'il peut prendre est un hachage, comme ici. P> li>
Carrierwave :: sanitizéfile code> se soucie de savoir si le fichier est vide. J'ai passé beaucoup trop à me demander pourquoi cela n'accepterait pas mon
stringio.new code>. Il a besoin là pour y avoir quelque chose de là, mais cela ne se soucie pas de quoi. Je lui ai donné un koala. P> Li>
ol> p>