2010-11-26 26 views
3

Comment puis-je tester cette petite partie du module, avec super? (Superclasse est action_dispatch-3.0.1 test/intégration ...) Le module est inclus dans SPEC/demandes d'intercepter après:RSpec mock ou stub super dans un modèle

module ApiDoc 
    def post(path, parameters = nil, headers = nil) 
    super 
    document_request("post", path, parameters, headers) if ENV['API_DOC'] == "true" 
    end 
    ... 
end 

Je ne veux pas exécuter le ActionDispatch :: Intégration- peu importe, mais je ne sais pas how to mock or stub super pour tester l'unité. Le module est seulement utilisé dans les spécifications, et aura une couverture de test de 100%, ce qui prouve que ces types de métriques sont inutiles. Je dois tester l'unité.

Un exemple, en cas de besoin, voici comment utiliser le module APIDOC

require 'spec_helper' 

describe "Products API" do 
    include ApiDoc ############## <---- This is my module 
    context "POST product" do 
    before do 
     @hash = {:product => {:name => "Test Name 1", :description => "Some data for testing"}} 
    end 

    it "can be done with JSON" do 
     valid_json = @hash.to_json 
     ############### the following 'post' is overriden by ApiDoc 
     post("/products.json",valid_json, 
     {"CONTENT_TYPE" => "application/json", 
     "HTTP_AUTHORIZATION" => ActionController::HttpAuthentication::Basic.encode_credentials("user", "secret")}) 
     response.should be_success 
    end 
    end 
end 

Répondre

4

Vous pouvez vérifier si la méthode est appelée la classe « super »

ActionDispatch::Integration.any_instance.should_receive(:post) 

Depuis ApiDock est seulement requis pour vos tests, vous pouvez également remplacer la méthode de publication avec alias_method_chain:

ActionDispatch::Integration.instance_eval do 
    def post_with_apidoc(path, parameters = nil, headers = nil) 
    post_without_apidoc 
    if ENV['API_DOC'] == "true" 
     document_request("post", path, parameters, headers) 
    end 
    end 
    alias_method_chain :post, :apidoc 
end 
+0

merci! J'utilise moka, donc cela fonctionne: 'ActionDispatch :: Integration :: Session.any_instance.expects (: post) .with xx', mais alors je ne peux pas mocker ApiDoc.post ou -.document_request, comme il est dit c'est la classe (d'ApiDoc) est 'RSpec :: Core :: ExampleGroup :: Nested_1' Comment est-ce que je moque dehors ces méthodes dans ce cas? Ou est-ce que je crée une classe factice pour l'inclure, pour tester ce comportement? – oma

+0

Créer une classe Dummy est la meilleure option que je pense. –

+0

Réponse acceptée en raison de la première ligne de code. Les tests unitaires dans une classe fictive sont une bonne idée. FYI, en utilisant 'super' est préférable au chaînage de méthode d'alias. Ils ont supprimé beaucoup de ces alias lors de la refactorisation des rails 2.x à 3. – oma

1

s simplement un complément à la réponse. C'est ainsi que j'ai fini par le tester

require 'spec_helper' 

describe 'ApiDoc' do 
    include ApiDoc 

    it "should pass the post to super, ActionDispatch" do 
    @path = "path" 
    @parameters = {:param1 => "someparam"} 
    @headers = {:aheader => "someheaders"} 
    ActionDispatch::Integration::Session.any_instance.expects(:post).with(@path, @parameters, @headers) 
    post(@path, @parameters, @headers) 
    end 
end 

class DummySuper 
    def post(path, parameters=nil, headers=nil) 
    #How to verify this is called? 
    end 
end 
class Dummy < DummySuper 
    include ApiDoc 
end 

describe Dummy do 

    it "should call super" do 
    subject.expects(:enabled?).once.returns(true) 
    #how to expect super, the DummySuper.post ? 
    path = "path" 
    parameters = {:param1 => "someparam"} 
    headers = {:aheader => "someheaders"} 
    subject.expects(:document_request).with("post", path, parameters, headers) 
    subject.post(path, parameters, headers) 
    end 
end 

et l'ApiDoc légèrement modifié.

module ApiDoc 
    def enabled? 
    ENV['API_DOC'] == "true" 
    end 

    def post(path, parameters = nil, headers = nil) 
    super 
    document_request("post", path, parameters, headers) if enabled? 
    end 

private 
    def document_request(verb, path, parameters, headers) 
    ... 
    end 
end 

je pourrais vérifier la super.post dans le premier test, mais je ne peux toujours pas comprendre comment faire exactement cela avec mes caractéristiques de la classe factice.