【问题标题】:Rcov: Why is this code not being considered covered?Rcov:为什么这段代码没有被考虑覆盖?
【发布时间】:2011-01-14 04:07:34
【问题描述】:

这是我的控制器:

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

编辑我的 rcov rake 与官方常见问题解答中列出的完全相同:eigenclass.org

RCov (0.9.7.1) 将控制器中直到“def index”的每一行列为绿色,之后的每一行(包括所有“end”)列为红色/未执行。我知道当我的测试实际执行时,它确实成功执行了代码。

为什么 RCov 给出不直观的结果?我这里有什么遗漏吗?

【问题讨论】:

  • 你的 rcov Rake 任务是什么样的?是默认的吗?

标签: ruby-on-rails ruby code-coverage rcov


【解决方案1】:

我的猜测是 rcov 只认为在实际测试用例中运行的代码被测试“覆盖”。您对“获取索引”的调用在技术上不是在测试用例中,而是在设置块中。 shoulda 在设置方面存在有趣的范围问题,也许 rcov 还不够聪明,无法意识到这一点。

尝试将代码放入测试用例块(见下文) - 只是看看这是否会改变事情。注意:我认为您不必像这样运行测试 - 只是看看它是否有效。

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

【讨论】:

    【解决方案2】:

    我猜你使用的是 ruby​​ 1.9? Rcov 不支持 ruby​​ 1.9 并产生不可预测的结果。请改用SimpleCov

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-08
      • 1970-01-01
      • 2016-05-16
      • 2016-10-31
      • 1970-01-01
      • 1970-01-01
      • 2015-06-18
      • 1970-01-01
      相关资源
      最近更新 更多