2016-09-28 5 views
1

Ich habe eine Rails 4.2 App mit einer API basierend auf Grape. Ich fing an, Tests dafür mit Rpsec zu schreiben. Meine Tests funktionieren großartig und testen, was ich erwartet habe. Aber wenn ich rspec am Terminal laufen lasse, zeigt Simplecov nicht die korrekte Abdeckung für die api-Dateien, wie Sie auf dem Bild unten sehen können.Simplecov - Falsche Testabdeckung für Grape API

Simplecov

Die Dateien auf dem Verzeichnis /lib/api/apphaben einige Abdeckung. Aber Simplecov zeigt sie als 0% abgedeckt.

zu vergleichen, ich lief Spezifikationen innerhalb RubyMine mit der in Coverage Tool gebaut, und es zeigt die korrekte Abdeckung:

enter image description here

So bin ich hier etwas fehlt? Was ist falsch mit SimpleCov?

das ist mein rails_helper.rb:

ENV['RAILS_ENV'] ||= 'test' 
require File.expand_path('../../config/environment', __FILE__) 

abort("The Rails environment is running in production mode!") if Rails.env.production? 
require 'spec_helper' 
require 'rspec/rails' 
require 'simplecov' 
SimpleCov.start 'rails' 

Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f } 


ActiveRecord::Migration.maintain_test_schema! 

RSpec.configure do |config| 

    config.include RSpec::Rails::RequestExampleGroup, type: :request, file_path: /spec\/api\/v1/ 


    config.fixture_path = "#{::Rails.root}/spec/fixtures" 

    config.use_transactional_fixtures = false 


    config.infer_spec_type_from_file_location! 

    Faker::Config.locale = 'pt-BR' 

end 

Dies ist eine der API-Endpunkte, trips.rb:

module Api 
    module App 
    class Trips < Grape::API 
     include Grape::Kaminari 
     resource :trips do 
     desc 'Return a list of trips of a vehicle.' 
     params do 
      requires :vehicle_id, type: Integer, desc: 'id of the vehicle' 
      optional :page, type: Integer, desc: 'Page of registers. Default to 1 (first page).' 
      optional :per, type: Integer, desc: 'Number of registers per page. Default to 25.' 
     end 
     get do 
      vehicle = Vehicle.find params[:vehicle_id] 
      if vehicle.user == current_user 
      trips = Trip.where(vehicle_id: vehicle.id).order(started_at: :desc) 

      present paginate(trips), with: Entities::Trip 
      else 
      error!('Unauthorized', 401) 
      end 
     end 

     desc 'Return a Trip' 
     params do 
      requires :id, type: Integer, desc: 'id of the Trip' 
     end 

     route_param :id do 
      get do 
      trip = Trip.find params[:id] 
      if trip.vehicle.user == current_user 
       present trip, with: Entities::Trip 
      else 
       error!('Unauthorized', 401) 
      end 

      end 
     end 

     end 
    end 
    end 
end 

Und dies ist ein Beispiel spec, die 100% (trips_spec.rb) bedeckt sein sollte:

describe Api::App::Trips do 
    include ApiHelpers 

    let(:user)   { create(:user) } 
    let(:user2)   { create(:user) } 
    let(:vehicle)  { create(:vehicle, user_id: user.id) } 
    let(:vehicle2)  { create(:vehicle, user: user2) } 
    let(:trip)   { create(:trip, vehicle: vehicle) } 
    let(:trip2)   { create(:trip, vehicle: vehicle2) } 
    let(:auth_headers) { user.create_new_auth_token } 




    describe 'GET /api/v1/trips/:id' do 

    context 'when not authenticated' do 
     it 'returns 401 unauthorized' do 
     get "/api/v1/trips/#{trip.id}" 
     expect(response).to have_http_status(401) 
     end 
    end 

    context 'when user owns the vehicle' do 

     it 'returns a trip by id' do 
     get "/api/v1/trips/#{trip.id}", nil, auth_headers 
     expect(response.status).to eq(200) 
     expect(json_response).to be_an Hash 
     end 
    end 

    context 'when vehicle is from another user' do 

     it 'returns error 404' do 
     get "/api/v1/trips/#{trip2.id}", nil, auth_headers 
     expect(response.status).to eq(401) 
     end 
    end 

    end 

    describe 'GET /api/v1/trips' do 

    context 'when user owns the vehicle' do 

     it 'returns a list of trips by vehicle id' do 
     get "/api/v1/trips?vehicle_id=#{vehicle.id}", nil, auth_headers 
     expect(response.status).to eq(200) 
     expect(json_response).to be_an Array 
     end 
    end 

    context 'when vehicle belongs to another user' do 
     it 'returns error 404' do 
     get "/api/v1/trips?vehicle_id=#{vehicle2.id}", nil, auth_headers 
     expect(response.status).to eq(401) 
     end 
    end 

    end 

end 

Antwort

3

Also habe ich das Problem herausgefunden: Ich war invok Simplecov auf rails_helper.rb. Der richtige Ort, um es aufzurufen, ist auf spec_helper.rb, ganz am Anfang.

+0

danke. Es funktioniert mit mir. – hqt