2016-02-18 7 views
9

Ich entschied mich zu versuchen mit simplecov gem. Und ich denke, es ist cooles Werkzeug, aber ich habe ein Problem:SimpleCov berechnet 0% Deckung für Benutzermodell

Ich habe Modell Benutzer und ich habe user_spec.rb, die Testfälle enthält, aber Simplecov zeigt 0% Abdeckung dieses Modells. Und es zeigt 100% Abdeckung für andere Modelle, und es ist wahr. Ich verstehe nicht, was Probleme mit dem Benutzermodell sind.

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 

Abdeckung

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 
+0

welchem ​​Befehl verwenden Sie die Spezifikation laufen? Sind Sie sicher, dass auch user_spec.rb ausgeführt wird - wenn Sie "binding.pry" oder "puts" in "#callbacks 'test" einfügen - würde es die Nachricht stoppen/drucken? – basiam

+0

Ja, ich bin sicher, ich habe Befehl rspec im Terminal verwendet –

+0

Ich sehe dieses Problem auch. Ich benutze Devise, und es sieht so aus, als ob du es auch bist. Ich frage mich, ob es irgendwie stört. Ich bin auf Devise 3.5.2, und du? Version von Simplecov ist 0.11.1. Dieses Problem begann gerade für mich. Mein Benutzermodell verfügt über umfangreiche Tests. –

Antwort

1

Die Metrik, die Displays ist die Anzahl der Zeilen simplecov, die im Prozess Fälle von Lauftest aufgerufen. Zum Beispiel, wenn ich habe:

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% Abdeckung zeigen, weil es jede einzelne Zeile in der Test-Klasse schlagen, wenn ich meine Brille laufen. Im Fall Ihrer Benutzerklasse rufen Ihre Spezifikationen tatsächlich keine Zeilen in der Benutzerklasse auf, weil Sie keine relevanten Zeilen haben (Ihre private Methode wird nicht berücksichtigt, um relevant zu sein).

Ich würde mir keine Sorgen um die 0% Abdeckung für Ihr Benutzermodell als die Tests, die Sie scheinen ziemlich umfangreich.

+0

danke für die Beschreibung, aber es ist sehr seltsam, Modell Admin ist ein Nachkomme von Modell Benutzer, user_spec.rb und admin_spec.rb haben fast den gleichen Code, aber simplecov zeigen 100% coverave von admin.rb und 0% von user.rb –

+0

Hmm, das ist ein bisschen seltsam. Haben Sie zusätzliche Methoden in Ihrem Admin-Modell? – Spacepotato

+0

nein, Admin

1

Ich sah das gleiche Problem, und ich denke, es hat etwas mit Spring rspec Binstubs zu tun. Ich benutze den spring-commands-rspec Edelstein und habe einen Binstub für rspec in bin/spring. Nach dem Erstellen dieses Binstubs gingen meine Simplecov-Testberechnungsberechnungen um 10% zurück und zeigten, dass mein Modell User eine Abdeckung von 0% aufwies. Wenn ich das Skript löschte (oder umbenannt hat) und rspec erneut ausgeführt hatte, war meine Berichterstattung wieder verfügbar.

Verwenden Sie spring-commands-rspec oder andere Spring Binstubs, um Ihre Tests durchzuführen? Ich poste mehr, sobald ich herausfinde, ob es einen Workaround gibt.

+0

Nein, ich benutze dieses Juwel nicht –

6

Es passiert bei mir nur, wenn ich Frühling verwende, tatsächlich, wenn ich rspec binstub verwende von spring-commands-rspec gem. Versuchen Sie, die Feder mit dem Befehl spring stop zu stoppen und führen Sie die Spezifikationen erneut mit rspec spec aus.

+0

Sicherlich sollte dies und die angenommene Antwort von jedem versucht werden, der das gleiche Problem hat. – phillyslick

+1

Ich musste spring mit DISABLE_SPRING env Variable deaktivieren, damit dies funktioniert, wenn Coverage ausgeführt wird. –

1

Ich hatte das gleiche Problem und fand nur die antwort hier: https://github.com/colszowka/simplecov/issues/82

Die Anforderung sollte geschehen, bevor Sie etwas anderes laden.In meinem Fall hatte ich:

require simplecov SimpleCov.start 'rails'

nach:

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

, die wahrscheinlich die devise Module nicht geladen werden. Sobald ich "requires simplecov" und "simplecov.start" an den Anfang von rails_helper verschoben habe, hat es wie erwartet funktioniert.

2

Sie haben eine initilizer wie diese zu erstellen:

config/initializers/simplecov.rb

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