【发布时间】: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