2009-10-02 11 views
0

Ce qui suit est l'application/modèles/websites.rbMocha + concombre pour se moquer de la réponse nette

class Masterpiece < ActiveRecord::Base 
    validates_presence_of :title, :link 
    validates_uri_existence_of :link, :allow_redirect => false 
end 

La deuxième validation du plug-in Validates Existence of URI plug-in

Ce qui suit est les caractéristiques/support/fichier mocha.rb

require 'mocha' 
World(Mocha::API) 

Before do 
    mocha_setup 
    @http_mock = mock('Net::HTTPResponse') 
    @http_mock.stubs(:code => '200', :message => "OK", :content_type => "text/html", :body => '<title>Test</title><body>Body of the page</body>') 
    Net::HTTP.expects(:get_response).returns(@http_mock) 
    #Website.expects(:validates_uri_existence_of).returns(true) 
end 

After do 
    begin 
    mocha_verify 
    ensure 
    mocha_teardown 
    end 
end 

Mais lorsque je tente d'exécuter une fonction de concombre, il va essayer de créer l'enregistrement et avant d'enregistrer le plug-in ci-dessus va essayer de vérifier sur le ne t pour obtenir la réponse. C'est bien.
Mais quand je veux l'obtenir mocké sur l'environnement de test, j'essaye d'employer le moka.

Comment dois-je écrire le code pour simuler la réponse Net ou la méthode de classe validates_uri_existence_of pour exécuter le test en douceur ??

Répondre

2

Le faux doit être de la bonne classe. Essayez:

Net::HTTP.expects(:get_response).returns(Net::HTTPSuccess.allocate) 

(Class#allocate instancie une classe sans appeler initialize)

+0

Eh bien, j'ai changé le fichier support/mocha.rb comme vous l'avez suggéré. Avant faire mocha_setup Net :: HTTP.expects (: Get_Response) .Retour (Net :: HTTPSuccess.allocate) fin Mais maintenant, quand je lance la fonction, l'erreur suivante est affichée! pas toutes les attentes ont été satisfaites attentes non satisfaites: - attendus exactement une fois, pas encore: Net :: invoquées HTTP.get_response (any_parameters) (Mocha :: ExpectationError) – Autodidact

+0

Aucune idée pourquoi il n'est pas appelé. Si l'intention est de ne pas toujours être appelé, vous devez utiliser 'stubs' au lieu d'attendre (même travail, n'entraîne pas d'échec quand il n'est pas déclenché). On dirait que le foo de Fakeweb (comme @Radar mentionné) est une solution beaucoup plus agréable. Se moquer à un niveau bas provoque presque toujours des maux de tête. – cwninja

+0

Merci. Je l'ai réglé juste pour l'instant en ajoutant .at_most (4) à la fin du code et cela a fonctionné. Mais je ne suis toujours pas satisfait de cette solution. J'ai regardé le FakeWeb avant de plonger dans Mocha mais je n'ai pas trouvé cette ligne de code pour remplacer celle de Moka. Pouvez-vous me donner cette ligne de code pour faire ce travail en utilisant FakeWeb? – Autodidact

2

Je vous recommande d'utiliser pour cette Fakeweb, car il est parfait pour elle.

+0

+1. J'essayais de me souvenir de ce que cela a appelé pour ma réponse. – cwninja