2010-02-07 12 views
6

Hier ist mein Controller:Rcov: Warum wird dieser Code nicht als abgedeckt betrachtet?

class MyController < ApplicationController 
    include MyHelper 

    def index 
    get_list_from_params do |list| 
     @list = list 
     respond_to do |format| 
     format.html 
     format.xml { render :xml => @list } 
     format.json { render :json => @list } 
     end 
    end 
    end 
end 

... die Helfer, die es auf basiert:

module MyHelper 
    def get_list_from_params(param = :id, &on_success) 
    raw_id = params[param] 
    begin 
     id = Integer(raw_id) 
    rescue 
     render :template => "invalid_id", :locals => {:id => raw_id } 
    else 
     yield MyList.new(id) 
    end 
    end 
end 

... und mein Funktionstest (die Shoulda verwendet):

class MyControllerTest < ActionController::TestCase 
    context "MyController index" do 
    setup do 
     get :index 
    end 

    should_respond_with :success 
    end 
end 

EDIT Mein rcov Rake ist genau das selbe wie das, das in der offiziellen FAQ aufgeführt ist: eigenclass.org

RCov (0.9.7.1) listet jede Zeile in der Steuerung bis "def index" als grün auf und jede Zeile danach (einschließlich aller "ends") als rot/nicht ausgeführt. Ich weiß, dass, wenn mein Test tatsächlich ausgeführt wird, der Code erfolgreich ausgeführt wird.

Warum gibt RCov nicht intuitive Ergebnisse? Gibt es etwas, das mir hier fehlt?

+0

Wie sieht Ihre rcov Rake-Aufgabe aus? Ist es der Standard? – BaroqueBobcat

Antwort

1

Meine Vermutung ist, dass rcov nur Code in tatsächlichen Testfällen als "abgedeckt" durch einen Test betrachtet. Ihr Aufruf "Index holen" ist technisch nicht in einem Testfall, sondern im Setup-Block. sophia hat interessante scope-probleme mit setup und vielleicht ist rcov einfach nicht schlau genug das zu realisieren.

Versuchen Sie, den Code in einen Testfallblock zu stecken (siehe unten) - nur um zu sehen, ob sich das ändert. Hinweis: Ich denke nicht, dass Sie Ihre Tests so durchführen sollten - es ist nur um zu sehen, ob es funktioniert.

context "MyController index" do 
    should "respond with success" do 
    get :index  
    assert_response :success 
    end 
end 
3

Meine Vermutung ist, dass Sie Ruby 1.9 verwenden? Rcov unterstützt Ruby 1.9 nicht und liefert impredictable Ergebnisse. Verwenden Sie stattdessen SimpleCov.

Verwandte Themen