2014-07-09 9 views
6

Mam pytanie, które jest naprawdę konkretne. Nie chcę wykonywać testu kontrolera, ale test żądania. I nie chcę używać Capybary, ponieważ nie chcę testować interakcji użytkownika, ale tylko stany odpowiedzi.Jak zmienić poddomeny w testach żądań z Rspec (do testów API)

Mam następujący test pod SPEC/wnioski/api/garage_spec.rb

require 'spec_helper' 

describe "Garages" do 

    describe "index" do 
    it "should return status 200" do 
     get 'http://api.localhost.dev/garages' 
     response.status.should be(200) 
     response.body.should_not be_empty 
    end 
    end 
end 

To działa. Ale ponieważ muszę zrobić więcej testów ... czy jest jakiś sposób, aby tego uniknąć? http://api.localhost.dev

Próbowałem z setup { host! 'api.localhost.dev' } Ale to nic nie robi. A before(:each) ustawienie bloku @request.host na coś, oczywiście zawiesza się, ponieważ @request jest zerowy przed wykonaniem jakiegokolwiek żądania http.

Trasy są ustawione poprawnie (aw rzeczywistości pracują) w ten sposób

namespace :api, path: '/', constraints: { subdomain: 'api' } do 
    resources :garages, only: :index 
end 

Odpowiedz

5

można utworzyć metody pomocnika w spec_helper.rb, coś takiego:

def my_get path, *args 
    get "http://api.localhost.dev/#{path}", *args 
end 

i jej wykorzystanie będzie być:

require 'spec_helper' 

describe "Garages" do 

    describe "index" do 
    it "should return status 200" do 
     my_get 'garages' 
     response.status.should be(200) 
     response.body.should_not be_empty 
    end 
    end 
end 
+0

ciekawy pomysł. Ale w ten sposób każde działanie powinno mieć własnego pomocnika. Mogę przestać pisać więcej kodu niż ten, który chcę wyschnąć! –

+0

@ jonnyjava.net Myślałem, że domena jest taka sama we wszystkich testach ... –

+0

Spróbowałem i spodobało mi się! Wygrałeś! Dziękuję Ci –

2

Spróbuj tego:

spec_helper.rb

RSpec.configure do |config| 
    config.before(:each, type: :api) do |example| 
    host! 'api.example.com' 
    end 
end 

plik Spec

require 'spec_helper' 

describe "Garages", type: :api do 

    describe "index" do 
    it "should return status 200" do 
     get 'garages' 
     response.status.should be(200) 
     response.body.should_not be_empty 
    end 
    end 
end