2010-02-07 89 views
6

這裏是我的控制器:Rcov:爲什麼這個代碼沒有被考慮覆蓋?

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 

...,它是基於助手:

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 

...和我的功能測試(這是使用早該):

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

    should_respond_with :success 
    end 
end 

編輯我的rcov rake與官方FAQ中列出的完全一樣:eigenclass.org

RCov(0.9.7.1)列出了控制器中的所有行,直到「def index」爲綠色,之後的每一行(包括所有的「end」)都顯示爲紅色/未執行。我知道,當我的測試實際執行時,它會成功執行代碼。

爲什麼RCov會給出不直觀的結果?有什麼我在這裏失蹤?

+0

你的rcov Rake任務是什麼樣的?它是默認的嗎? – BaroqueBobcat 2010-02-08 04:38:06

回答

1

我的猜測是rcov只考慮在實際測試用例中運行的代碼被測試「覆蓋」。您對「獲取索引」的調用在技術上並不在測試案例中,而是在設置塊中。應該有一個有趣的範圍 - 設置的問題,也許rcov根本不夠聰明來實現這一點。

嘗試將代碼放入測試用例塊(請參閱下文) - 以查看是否會改變事物。注意:我認爲你不應該像這樣運行你的測試 - 只是看它是否有效。

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

我的猜測是你使用的是Ruby 1.9嗎? Rcov不支持Ruby 1.9併產生不可預知的結果。改爲使用SimpleCov