【问题标题】:minitest testing and code coverageminitest 测试和代码覆盖率
【发布时间】:2019-06-17 17:02:39
【问题描述】:

我使用mini-test 来测试框架。我使用omniauth gem 进行身份验证。我使用simplecov 进行代码覆盖。我使用"bundle exec rake""rake minitest:controllers" 运行我的测试。我举一个控制器的例子。当我运行rake minitest:controllers 时,控制器代码覆盖率变为 100%。但是,当我运行bundle exec rake 时,控制器代码覆盖率变为 60%。

SessionsController.rb 代码:

 class SessionsController < ApplicationController
   def create
     auth = request.env["omniauth.auth"]
     person=Person.find_by_provider_and_uid(auth.provider,auth.uid) || Person.create_with_omniauth(auth)
     redirect_to root_path
   end
end

SessionsController_test.rb

require "minitest_helper"

describe SessionsController do
  before do
    request.env["omniauth.auth"] = OmniAuth.config.mock_auth[:identity] 
    @person = Fabricate.build(:person)
  end

  it "should create authentication" do
    assert_difference('Person.count') do
      post :create, :provider => "identity"
    end
    assert_redirected_to root_path @person
  end
end

我想知道如果我在写作测试中错过了一分。我等你的想法。提前致谢。

编辑

minitest_helper.rb

require 'simplecov'
Simplecov.start

ENV["RAILS_ENV"] = "test"
require File.expand_path('../../config/environment', __FILE__)

require "minitest/autorun"
require "minitest/rails"
require "minitest/pride"
require 'database_cleaner'
require "minitest/rails/capybara"

require "minitest-mongoid"

DatabaseCleaner[:mongoid].strategy = :truncation
#OmniAuth.config.test_mode = true
OmniAuth.config.add_mock(:identity, {
    :uid => '12345'

})


class MiniTest::Spec
 before :each do
    DatabaseCleaner.start
  end

  after :each do
    DatabaseCleaner.clean
  end
end

【问题讨论】:

  • 对于您的代码覆盖率差异,这是正常的。覆盖率是在运行的测试中测量的。因此,总体而言,您将运行所有测试,并为此记录覆盖率。
  • 对不起。但是,当我阅读您的答案时,我有点困惑。我的承保结果正常吗?在我们的项目中,我们接受 100% 的覆盖率。我的领导想要这个。有没有办法保证100%的覆盖率?感谢您的回复。
  • 您能发布为每次运行生成的覆盖率摘要吗?也许在一个要点?我认为这将有助于我们为您指明正确的方向。
  • 如果报告的覆盖率低于您的预期,则可能存在问题,而不是遵守 100% 的覆盖率。关键是,当使用 rcov 时,它将显示当时被测区域的覆盖范围。为了确保完整的覆盖率报告(无论实际情况是否为 100%)运行完整套件以记录该时间点。
  • 你能发布你的 minitest_helper 吗?我怀疑你加载 simplecov 太晚了,它必须在规范助手的第一行。另外,您使用的是哪个确切的 ruby​​ 版本?

标签: ruby-on-rails ruby omniauth minitest


【解决方案1】:

根据Simplecov's documentation,您只需在test/test_helper.rb 顶部添加这些行:

# test/test_helper.rb
require 'simplecov'
SimpleCov.start
# ...

另外不要忘记在测试组中安装 simplecov gem:

# Gemfile
# ...
group :test do
  gem 'simplecov'
end

就是这样。

Rails 6:我遇到了 Rails 6 的一些问题并测试了并行化,因此您可以在 test/test_helper.rb 中停用它:

# test/test_helper.rb
# ...
class ActiveSupport::TestCase
  # ...
  # parallelize(workers: 2)
end

【讨论】:

  • 花了几个小时试图弄清楚为什么它不起作用。禁用并行化修复它。非常感谢!
【解决方案2】:

没有更多信息很难说。

首先尝试rake minitest:all 并使用结果更新您的问题。

如果之前的测试没有得出肯定的结论,请尝试以下操作:

namespace :test do
  task :coverage do
    require 'simplecov'
    SimpleCov.start 'rails' # feel free to pass block
    Rake::Task["test"].execute
  end
end

让我们知道,我们可以编辑或更新答案。

众所周知,Minitest 遇到了一些问题。我相信它仍在进行中,不确定他们现在的位置。不是你,是最小的。这种解决方法在某些情况下会有所帮助,也许对您也有帮助。

【讨论】:

  • 答案来自 2015 年。Rails 6 那时还不存在。如果您能提供帮助,请随时添加建议。
  • 是的,我明白这一点,但这个问题没有被标记为 Rails 5。我只是警告说,如果有人用 Rails 6 尝试这个,这可能行不通。
  • 现在我明白你的意思了。我看到您提供了一个补充解决方案的答案。好举动,点赞。
猜你喜欢
  • 2020-08-12
  • 1970-01-01
  • 2012-01-18
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多