2010-02-07 2 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 

... и мой функциональный тест (который использует Shoulda):

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

    should_respond_with :success 
    end 
end 

EDIT Мой rcov rake точно такой же, как тот, который указан в официальном FAQ: eigenclass.org

RCov (0.9.7.1) перечисляет каждую строку в контроллере до «def index» как зеленый, и каждую строку после этого (включая все «end») как красные/неисполненные. Я знаю, что когда мой тест на самом деле выполняется, он успешно выполняет код.

Почему RCOV дает неинтуитивные результаты? Здесь что-то не хватает?

+0

Как выглядит ваша задача Rcov Rake? Это значение по умолчанию? – BaroqueBobcat

ответ

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.