2012-12-04 3 views
0

Comment se moquer de cet appel dans RSpec?Comment se moquer de Kernel.open ou open-uri sans appeler le noyau explicitement?

require 'open-uri' 
class FileFoo < ActiveRecord::Base 
    def download image_url 
    open("tmp/#{file}", 'wb') do |file| 
     file << open(image_url).read 
    end 
    end 
end 

Essayé se moquant FileFoo.open, mais cela ne fonctionne pas parce que je suis en utilisant le fichier téléchargé, pas la valeur de retour.

code modifié à file << Kernel.open(image_url).read et utilisé les éléments suivants:

Kernel.stub_chain(:open, :read).and_return(File.read image_fixture) 

Cela fonctionne très bien, mais est-il un moyen de se moquer Kernel.open().read, sans appeler explicitement le noyau?

Répondre

2

Souvent, je pense qu'un meilleur test dans cette situation n'est pas de se moquer des appels de système de fichiers spécifiques, mais plutôt de remplacer le système de fichiers avec une gemme comme fakefs. Je parle plus à ce sujet un article de blog appelé Fake It!. L'idée est que les appels de système de fichiers spécifiques de tronçonnage sont assez fragiles, mais écrire dans le système de fichiers réel n'est pas nécessairement souhaitable dans un test unitaire non plus. Quelque chose comme fakefs est un bon moyen agréable beaucoup de temps.

1

Je pense que c'est difficile parce que la conception de la méthode download est pauvre. Il fait 2 choses:

  1. fichier via Récupération du HTTP
  2. enregistrer sur le disque

Ces fonctions distinctes doivent tous deux être testés, et le premier devrait être moqué. Je ne vois aucune raison de se moquer du système de fichiers car la sauvegarde du fichier (qui est petit) est rapide et facile à tester.

Si la méthode a été divisée en 2 méthodes, puis:

  1. fetch with http renverrait le fichier.
  2. save file l'enregistrerait.

Cette approche simplifie les simulations et les tests.

Questions connexes