2016-12-31 3 views
1

Mon programme télécharge un fichier zip à partir du web puis l'analyse. Le code lié à l'analyse syntaxique pertinente est:Comment utiliser différentes valeurs de paramètres dans un mock/stub RSpec?

Zip::File.open("real_file.zip") do |zip_file| 
    # do stuff 
end 

Dans mon environnement de test RSpec, je voudrais bouchonner ce code pour analyser un fichier faux/faux au lieu du vrai. Plus précisément, je voudrais remplacer la valeur du paramètre "real_file.zip" par "mock_file.zip".

J'ai essayé l'approche suivante:

allow(Zip::File).to receive(:open).and_return(Zip::File.open("mock_file.zip")) 

... mais cela empêche l'exécution de code à l'intérieur du bloc (# do stuff). Je ne veux pas que le contenu du fichier fictif soit retourné par la méthode, mais que rahter soit affecté à la valeur zip_file pour une utilisation ultérieure. Comment cela peut il etre accompli?

+0

Je pense que vous voulez' permettre (Zip :: File) .à reçoivent (: ouvert) {| & bloc | block.call (Zip :: File.open ('mock_file.zip'))} ' https://www.relishapp.com/rspec/rspec-mocks/v/3-2/docs/configuration-responses/ implémentation en bloC# yield-to-the-caller's-block – mroach

Répondre

1

Voici ce que vous voulez faire:

mock_file = Zip::File.open('mock_file.zip') 
allow(Zip::File).to receive(:open) { |&block| block.call(mock_file) } 

Ce que vous faites ici donne des une valeur au bloc dans votre code d'origine. Le problème avec le simple renvoi d'une valeur scalaire est qu'elle ne rapporte rien à votre bloc, donc il ne sera pas appelé. Notez que j'ouvre le fichier fictif avant de mettre dans l'attente du message car il intercepterait également votre appel à Zip::File.open et provoquer un débordement de pile agréable.

Plus d'informations: https://www.relishapp.com/rspec/rspec-mocks/v/3-2/docs/configuring-responses/block-implementation#yield-to-the-caller « s-bloc

+0

succès! Je suis tombé sur cette stratégie plus tôt mais je n'ai pas pu trouver comment traduire les exemples de documentation pour s'adapter à ma propre application. merci @machine – s2t2