2016-02-18 14 views
9

Postanowiłem spróbować użyć klejnotu simplecov. I myślę, że to jest fajne narzędzie, ale mam jeden problem:SimpleCov obliczyć 0% pokrycia dla modelu użytkownika

Mam model User i mam user_spec.rb, który zawiera przypadki testowe, ale simplecov pokazuje 0% pokrycie tego modelu. I pokazuje 100% pokrycia dla innych modeli, i To prawda. Nie rozumiem, jakie problemy występują z modelem użytkownika.

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 

pokrycie

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

co komenda używacie do uruchomienia spec? Jesteś pewien, że user_spec.rb jest również uruchamiany - jeśli umieścisz 'binding.pry' lub' puts ', to działa "wewnątrz" testu #callbacks - czy zatrzymałoby/wydrukowało wiadomość? – basiam

+0

Tak, jestem pewien, użyłem polecenia rspec na terminalu –

+0

Widzę również ten problem. Używam Devise i wygląda na to, że ty też. Zastanawiam się, czy to w jakiś sposób przeszkadza. Jestem na Devise 3.5.2, a ty? Wersja Simplecov to 0.11.1. Ten problem właśnie się zaczął dla mnie. Mój model użytkownika ma obszerne testy. –

Odpowiedz

1

Metryka że simplecov wyświetlacze to liczba linii, które sprawdzony w trakcie prowadzenia testów. Na przykład, jeśli miałem:

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 pokaże 100% populacji, ponieważ jest uderzanie każdy pojedynczy wiersz w klasie próbę, gdy biegnę moje widowisko. W przypadku twojej klasy użytkownika, twoja specyfikacja nie wywołuje żadnych linii w klasie użytkownika, ponieważ nie masz żadnych odpowiednich linii (nie jest ważne, aby twoja metoda prywatna była istotna).

Nie martwię się o pokrycie 0% dla modelu użytkownika, ponieważ testy wydają się dość kompleksowe.

+0

dzięki za opis, ale to bardzo dziwne, model Admin jest potomkiem modelu User, user_spec.rb i admin_spec.rb mają prawie ten sam kod, ale simplecov pokazuje 100% coverave z admin.rb i 0% użytkownika.rb –

+0

Hmm, to trochę dziwne. Czy masz jakieś dodatkowe metody w swoim modelu administratora? – Spacepotato

+0

nie, Admin

1

Widziałem ten sam problem i myślę, że ma on coś wspólnego z binstubami Spring rspec. Używam klejnotu spring-commands-rspec i mam binstub dla rspec w bin/spring. Po utworzeniu tego binstuba moje obliczenia zasięgu testu Simplecov spadły o 10% i pokazały, że mój model User miał zasięg 0%. Kiedy usunąłem (lub zmieniłem nazwę również działa) skrypt bin/spring i ponownie uruchomiłem rspec, mój zasięg powrócił.

Czy używasz spring-commands-rspec lub innych wiosennych binstubów do przeprowadzania testów? Będę pisać więcej, gdy tylko się zorientuję, czy istnieje obejście.

+0

Nie, nie używam tego klejnotu. –

6

Zdarza się to ze mną tylko wtedy, gdy używam sprężyny, kiedy używam binarka rspec wygenerowanego przez klejnot spring-commands-rspec. Spróbuj zatrzymać wiosnę za pomocą polecenia spring stop i ponownie uruchom specyfikację za pomocą rspec spec.

+0

Z pewnością ta i zaakceptowana odpowiedź powinna być wypróbowana przez każdego, kto ma ten sam problem. – phillyslick

+1

Musiałem wyłączyć sprężynę ze zmienną env DISABLE_SPRING, aby to działało podczas działania pokrycia. –

1

miałem ten sam problem i po prostu okazało się, że odpowiedź tutaj: https://github.com/colszowka/simplecov/issues/82

Wymaganie powinno nastąpić przed załadowaniem czegokolwiek innego.W moim przypadku miałem:

require simplecov SimpleCov.start 'rails'

po:

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

który zapewne moduły opracować nie jest załadowany. Jak tylko przesunąłem "require simplecov" i "simplecov.start" na sam początek rails_helper, działało to zgodnie z oczekiwaniami.

2

Musisz utworzyć initilizer takiego:

config/inicjalizatory/simplecov.rb

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