Dois-je stub le modèle dans Factory girl ou dans le fichier de spec pendant le test?
Presque tous les spec de fichier que j'ai trouvé je poste des trucs comme:
before :each do
@cimg = Factory.build :cimg_valid
@cimg.stub(:validate_img).and_return true
@cimg.stub(:validate_img_url).and_return true
@cimg.stub(:save_images).and_return true
@cimg.stub(:process_image).and_return true
@cimg.stub(:img).and_return true
end
Je veux dire, le modèle que je reçois de l'Usine.la construction est tout à fait valable. Mais si je n'ai pas de stub ce genre de choses, il enregistre des choses dans le système de fichiers, et valide les trucs que je ne suis pas test...
Ce que je veux dire, je pense qu'il serait plus propre de faire quelque chose comme ceci:
before :each do
@cimg = Factory.build :cimg_for_testing_tags
end
Si cogner à l'intérieur de l'Usine est encore possible.
Quelle est la bonne façon pour talon le modèle?
Vous devez vous connecter pour publier un commentaire.
Dans les versions récentes de factory_girl vous avez un after_build de rappel, donc, je crois que vous pourriez définir votre usine comme ceci:
Mise à JOUR
Après factory_girl 3.3.0, la syntaxe a changé à la suite:
"Using 'stub' from rspec-mocks' old ':should' syntax without explicitly enabling the syntax is deprecated."
Malheureusement, si vous passez à l'aide de la nouvelle rspecallow()
syntaxe vous rencontrez un autre problème, car FactoryGirl ne comprend pas de RSpec méthodes:NoMethodError: undefined method 'allow' for #<FactoryGirl::SyntaxRunner:0x007f95469cc0d8>
. Quelqu'un sait-il une solution à ce qui fonctionne avec les dernières versions?def cimg.validate_img; true; end
et effectivement il écraser sans rspec.@fkreusch réponse fonctionne très bien jusqu'à ce que vous utilisez le nouveau RSpec
expect()
syntaxe (3.0+)La mise en
rails_helper.rb
fonctionne pour moi:Dans le cas des OP exemple, vous pouvez désormais le faire:
De crédit: github.com/printercu voir: https://github.com/thoughtbot/factory_bot/issues/703#issuecomment-83960003
The use of doubles or partial doubles from rspec-mocks outside of the per-test lifecycle is not supported.
rails_helper.rb
était en cours d'exécutionFactoryGirl.lint
dans unbefore(:suite)
bloc, et les talons ne peuvent pas être mises en place. J'ai résolu le problème en les enveloppant de la charpie appel dansRSpec::Mocks.with_temporary_scope { ... }
.FactoryGirl
est maintenantFactoryBot
, de sorte que ces deux noms qui devrait changer dans votre exemple.Vous pouvez également envisager d'utiliser FactoryGirl#build_stubbed.
Une usine devrait produire "monde réel" des objets, par conséquent, c'est une mauvaise pratique (et erreurs) pour le changement de comportement (c'est à dire stub) dans une usine.
Vous pouvez faire
et si votre
before
clause devient trop grande, vous pouvez extraire vers un autre méthode ou créer une maquette de la classe enfant qui l'emporte sur les méthodes que vous souhaitez stub.