SimpleCov 计算用户模型的覆盖率为 0%
SimpleCov calculate 0% coverage for user model
我决定尝试使用 simplecov gem,我认为这是一个很酷的工具,但我有一个问题:
我有一个模型 User
,我有包含测试用例的 user_spec.rb
,但 simplecov 显示该模型的覆盖率为 0%。它显示其他模型的覆盖率为 100%,这是事实。我不明白 User
模型有什么问题。
class User < ActiveRecord::Base
extend Enumerize
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
STATUS_ACTIVE = :active
STATUS_BANNED = :banned
enumerize :status, in: [STATUS_ACTIVE, STATUS_BANNED], default: STATUS_ACTIVE
with_options inverse_of: :user, dependent: :destroy do
has_one :profile
has_many :articles
end
before_create :build_default_profile
private
def build_default_profile
build_profile
end
end
user_spec.rb
require 'rails_helper'
RSpec.describe User, type: :model do
describe '#validations' do
it { should have_one(:profile).dependent(:destroy) }
it { should validate_presence_of(:email) }
it { should validate_presence_of(:password) }
it { should validate_confirmation_of(:password) }
it { should enumerize(:status).in(User::STATUS_ACTIVE, User::STATUS_BANNED).with_default(User::STATUS_ACTIVE) }
#TODO other devise validations
end
describe '#callbacks' do
it 'creates profile after_create' do
user = build(:user)
expect(user.profile).to be_nil
user.save
expect(user.profile).to be_a(Profile)
end
it 'must not create profile after update' do
user = create(:user)
profile = user.profile
user.email = Faker::Internet.email
user.save
expect(profile.id).to eq(Profile.find_by(user_id: user.id).id)
end
end
end
覆盖范围
File % covered Lines Relevant Lines Lines covered Lines missed Avg. Hits / Line
app/models/user.rb 0.0 % 28 28 0 28 0.0
app/models/admin.rb 100.0 % 3 1 1 0 1.0
app/models/article.rb 100.0 % 32 19 19 0 5.8
app/models/profile.rb 100.0 % 13 6 6 0 1.0
simplecov 显示的指标是 运行ning 测试用例过程中调用的行数。例如,如果我有:
class Test
def method
'Response'
end
end
RSpec.describe Test, type: :model do
context '#method' do
let(:test) { Test.new }
it 'returns response' do
expect(test.method).to eq('Response')
end
end
end
simplecov 将显示 100% 的覆盖率,因为当我 运行 我的规格时,它会击中测试 class 中的每一行。对于您的用户 class,您的规范实际上并没有调用用户 class 中的任何行,因为您没有任何相关行(它不认为您的私有方法是相关的).
我不会担心您的用户模型的 0% 覆盖率,因为您的测试看起来非常全面。
我看到了同样的问题,我认为它与 Spring rspec
binstubs 有关。我正在使用 spring-commands-rspec
gem 并且在 bin/spring
中有一个用于 rspec 的 binstub。创建该 binstub 后,我的 Simplecov 测试覆盖率计算下降了 10%,并显示我的 User
模型的覆盖率为 0%。当我删除(或重命名也有效)bin/spring
脚本并重新 运行 rspec
时,我的覆盖范围恢复了。
您是否使用 spring-commands-rspec
或任何其他 Spring binstub 来 运行 您的测试?一旦我弄清楚是否有解决方法,我会再 post。
只有在我使用 spring 时才会发生这种情况,实际上是在我使用 rspec 由 spring-commands-rspec
gem 生成的 binstub 时发生。尝试使用命令 spring stop
和 运行 规范再次停止 spring rspec spec
。
确保您正确启动了 SimpleCov。在你的情况下,
Load and launch SimpleCov at the very top of your rails_helper.rb
我遇到了同样的问题,刚刚在这里找到了答案:https://github.com/colszowka/simplecov/issues/82
要求应该在加载任何其他内容之前发生。就我而言,我有:
require simplecov
SimpleCov.start 'rails'
之后:
require File.expand_path('../../config/environment', __FILE__)
这可能导致未加载设计模块。一旦我将 "require simplecov" 和 "simplecov.start" 移动到 rails_helper 的开头,它就会按预期工作。
你必须像这样创建一个初始化器:
config/initializers/simplecov.rb
if ENV['RAILS_ENV'] == 'test'
require 'simplecov'
SimpleCov.start 'rails'
puts "required simplecov"
end
我有类似的问题。我有当前的 simplecov 0.17.1.
我使用默认设置的 Rails 6(Minitest 和 Spring,没有 rspec),我 运行 我的测试 rails test
.
我已经尝试了所有其他答案,但都没有成功。
simplecov 可能有问题:https://github.com/colszowka/simplecov/issues/671
我正在尝试 fastcov
这样的替代方案
edit1
fastcov 似乎是 simplecov 的轻量版,一点也不成熟。它还没有发布! 他们可以替代 simplecov 吗?!
edit2
我设法通过添加到 bin/rails
的顶部使其工作
#!/usr/bin/env ruby
if ENV['RAILS_ENV'] == 'test'
require 'simplecov'
SimpleCov.start 'rails'
puts "required simplecov"
end
# ...
AND在test_helper.rb
,我设置parallelize(workers: 1)
# test/test_helper.rb
require 'simplecov'
SimpleCov.start 'rails'
ENV['RAILS_ENV'] ||= 'test'
require_relative '../config/environment'
require 'rails/test_help'
class ActiveSupport::TestCase
parallelize(workers: 1)
fixtures :all
end
I 运行 使用命令 RAILS_ENV=test rails test
进行测试
我决定尝试使用 simplecov gem,我认为这是一个很酷的工具,但我有一个问题:
我有一个模型 User
,我有包含测试用例的 user_spec.rb
,但 simplecov 显示该模型的覆盖率为 0%。它显示其他模型的覆盖率为 100%,这是事实。我不明白 User
模型有什么问题。
class User < ActiveRecord::Base
extend Enumerize
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
STATUS_ACTIVE = :active
STATUS_BANNED = :banned
enumerize :status, in: [STATUS_ACTIVE, STATUS_BANNED], default: STATUS_ACTIVE
with_options inverse_of: :user, dependent: :destroy do
has_one :profile
has_many :articles
end
before_create :build_default_profile
private
def build_default_profile
build_profile
end
end
user_spec.rb
require 'rails_helper'
RSpec.describe User, type: :model do
describe '#validations' do
it { should have_one(:profile).dependent(:destroy) }
it { should validate_presence_of(:email) }
it { should validate_presence_of(:password) }
it { should validate_confirmation_of(:password) }
it { should enumerize(:status).in(User::STATUS_ACTIVE, User::STATUS_BANNED).with_default(User::STATUS_ACTIVE) }
#TODO other devise validations
end
describe '#callbacks' do
it 'creates profile after_create' do
user = build(:user)
expect(user.profile).to be_nil
user.save
expect(user.profile).to be_a(Profile)
end
it 'must not create profile after update' do
user = create(:user)
profile = user.profile
user.email = Faker::Internet.email
user.save
expect(profile.id).to eq(Profile.find_by(user_id: user.id).id)
end
end
end
覆盖范围
File % covered Lines Relevant Lines Lines covered Lines missed Avg. Hits / Line
app/models/user.rb 0.0 % 28 28 0 28 0.0
app/models/admin.rb 100.0 % 3 1 1 0 1.0
app/models/article.rb 100.0 % 32 19 19 0 5.8
app/models/profile.rb 100.0 % 13 6 6 0 1.0
simplecov 显示的指标是 运行ning 测试用例过程中调用的行数。例如,如果我有:
class Test
def method
'Response'
end
end
RSpec.describe Test, type: :model do
context '#method' do
let(:test) { Test.new }
it 'returns response' do
expect(test.method).to eq('Response')
end
end
end
simplecov 将显示 100% 的覆盖率,因为当我 运行 我的规格时,它会击中测试 class 中的每一行。对于您的用户 class,您的规范实际上并没有调用用户 class 中的任何行,因为您没有任何相关行(它不认为您的私有方法是相关的).
我不会担心您的用户模型的 0% 覆盖率,因为您的测试看起来非常全面。
我看到了同样的问题,我认为它与 Spring rspec
binstubs 有关。我正在使用 spring-commands-rspec
gem 并且在 bin/spring
中有一个用于 rspec 的 binstub。创建该 binstub 后,我的 Simplecov 测试覆盖率计算下降了 10%,并显示我的 User
模型的覆盖率为 0%。当我删除(或重命名也有效)bin/spring
脚本并重新 运行 rspec
时,我的覆盖范围恢复了。
您是否使用 spring-commands-rspec
或任何其他 Spring binstub 来 运行 您的测试?一旦我弄清楚是否有解决方法,我会再 post。
只有在我使用 spring 时才会发生这种情况,实际上是在我使用 rspec 由 spring-commands-rspec
gem 生成的 binstub 时发生。尝试使用命令 spring stop
和 运行 规范再次停止 spring rspec spec
。
确保您正确启动了 SimpleCov。在你的情况下,
Load and launch SimpleCov at the very top of your rails_helper.rb
我遇到了同样的问题,刚刚在这里找到了答案:https://github.com/colszowka/simplecov/issues/82
要求应该在加载任何其他内容之前发生。就我而言,我有:
require simplecov
SimpleCov.start 'rails'
之后:
require File.expand_path('../../config/environment', __FILE__)
这可能导致未加载设计模块。一旦我将 "require simplecov" 和 "simplecov.start" 移动到 rails_helper 的开头,它就会按预期工作。
你必须像这样创建一个初始化器:
config/initializers/simplecov.rb
if ENV['RAILS_ENV'] == 'test'
require 'simplecov'
SimpleCov.start 'rails'
puts "required simplecov"
end
我有类似的问题。我有当前的 simplecov 0.17.1.
我使用默认设置的 Rails 6(Minitest 和 Spring,没有 rspec),我 运行 我的测试 rails test
.
我已经尝试了所有其他答案,但都没有成功。
simplecov 可能有问题:https://github.com/colszowka/simplecov/issues/671
我正在尝试 fastcov
这样的替代方案edit1
fastcov 似乎是 simplecov 的轻量版,一点也不成熟。它还没有发布! 他们可以替代 simplecov 吗?!
edit2
我设法通过添加到 bin/rails
#!/usr/bin/env ruby
if ENV['RAILS_ENV'] == 'test'
require 'simplecov'
SimpleCov.start 'rails'
puts "required simplecov"
end
# ...
AND在test_helper.rb
,我设置parallelize(workers: 1)
# test/test_helper.rb
require 'simplecov'
SimpleCov.start 'rails'
ENV['RAILS_ENV'] ||= 'test'
require_relative '../config/environment'
require 'rails/test_help'
class ActiveSupport::TestCase
parallelize(workers: 1)
fixtures :all
end
I 运行 使用命令 RAILS_ENV=test rails test