SimpleCov计算用户模型的0%覆盖率

时间:2016-02-18 08:56:52

标签: ruby-on-rails rspec simplecov

我决定尝试使用simplecov gem。我认为这是很酷的工具,但我有一个问题:

我有模型用户,我有user_spec.rb,其中包含测试用例,但simplecov显示该模型的0%覆盖率。它显示其他型号的100%覆盖率,这是真的。我不明白用户模型有什么问题。

$stmt = $db->prepare('INSERT INTO business (bus_id,bus_name,bus_description,bus_phone,bus_email,bus_website,bus_category,bus_address,bus_hours,memberID) VALUES (NULL, :name, :description, :phone, :email, :website, :category, :address, :hours, $userID)');  

user_spec.rb

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

覆盖

 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

7 个答案:

答案 0 :(得分:6)

只有当我使用spring时才会发生这种情况,实际上当我使用spring-commands-rspec gem生成的rspec binstub时。尝试使用spring stop命令停止弹簧并使用rspec spec再次运行规范。

答案 1 :(得分:6)

确保您正确启动SimpleCov。在你的情况下,

  

加载并启动 rails_helper.rb

的SimpleCov

查看更多:https://github.com/colszowka/simplecov#getting-started

答案 2 :(得分:3)

你必须像这样创建一个启动器:

  

配置/初始化/ simplecov.rb

if ENV['RAILS_ENV'] == 'test'
  require 'simplecov'
  SimpleCov.start 'rails'
  puts "required simplecov"
end

答案 3 :(得分:1)

simplecov显示的指标是在运行测试用例的过程中调用的行数。例如,如果我有:

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%的覆盖率,因为当我运行我的规范时它会击中Test类中的每一行。对于您的用户类,您的规范实际上并未调用用户类中的任何行,因为您没有任何相关行(它不会考虑您的私有方法是相关的)。

我不担心您的用户模型的覆盖率为0%,因为您的测试看起来非常全面。

答案 4 :(得分:1)

我看到同样的问题,我认为它与Spring rspec binstubs有关。我正在使用spring-commands-rspec gem并在bin/spring中为rspec创建了一个binstub。创建binstub后,我的Simplecov测试覆盖率计算下降了10%,并显示我的User模型的覆盖率为0%。当我删除(或重命名也适用于)bin/spring脚本并重新运行rspec时,我的保护范围已备份。

您是否正在使用spring-commands-rspec或任何其他Spring binstub来运行测试?一旦我弄清楚是否有解决方法,我会发布更多信息。

答案 5 :(得分:1)

我遇到了同样的问题,只是在这里找到答案:https://github.com/colszowka/simplecov/issues/82

在加载任何其他内容之前应该发生这种要求。在我的情况下,我有:

require simplecov SimpleCov.start 'rails'

后:

require File.expand_path('../../config/environment', __FILE__)

这可能使得设计模块没有被加载。一旦我移动了&#34;需要simplecov&#34;和&#34; simplecov.start&#34;在rails_helper的最开始,它按预期工作。

答案 6 :(得分:0)

我有一个类似的问题。我有当前的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
# ...
test_helper.rb

AND ,我设置了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

我使用命令RAILS_ENV=test rails test

运行测试