2012-03-30 19 views
6

Poszukuję czystej metody użycia JBuilder i przetestowania wyjścia json z RSpec. Popularnym sposobem testowania JSON jest implementacja metody as_json, a następnie w RSpec porównywanie otrzymanego obiektu z metodą object.to_json. Ale dużym powodem, dla którego używam JBuildera, jest to, że nie chcę wszystkich atrybutów, które wypluwa to_json; więc to zrywa porównanie.Jak korzystać z RSpec z JBuilder?

Obecnie z JBuildera Mam wykonać następujące czynności, aby sprawdzić wyniki rspec:

1) Utwórz obiekt fabryczne: @venue

2) Utwórz skrót w moim teście RSpec że zawiera „oczekuje” JSON ciąg powrotem

@expected => {:id => @venue.id,:name=>@venue.name..........} 

2) Porównaj @expected ciąg do results.response.body który jest zwracany z wywołania JSON.

Wydaje się to proste, z wyjątkiem tego, że mam obiekty renderowane z 15+ atrybutami, a budowanie łańcucha @expected hash jest kłopotliwe i bardzo kruche. Czy jest lepszy sposób to zrobić?

+0

Zrobiłem dokładnie to. Nie mogę wymyślić lepszego sposobu na zrobienie tego. Zbudowałem skrót i zastosowałem '.to_json' na' @ expected'. Jedną z rzeczy, które przyspieszyłem i sprawię, że będzie mniej krucha. Być może kosztem dokładności? Czy budować moje hashe z kolekcją i mapą. Przypuszczam, że specyfika budowania niestandardowego szablonu z dowolną biblioteką budowania ciągów JSON wymaga napisania testu, który pasuje do specyfiki pracy, którą wykonujesz ..:/ – stuartc

+0

@beeudoublez czy można używać RSpec do testowania widoków jbuildera? Mam problem z uzyskaniem polecenia rspec do przekazania obiektów do widoku, aby program obsługi jbuildera mógł skonstruować JSON. Czy masz przykład działającego widoku '* _spec.rb' pliku? – sorens

Odpowiedz

4

Powinieneś być w stanie przetestować swoje poglądy JBUILDER z rspec poglądów specyfikacji. Dokumenty można obejrzeć pod numerem https://www.relishapp.com/rspec/rspec-rails/v/2-13/docs/view-specs/view-spec.

Przykładowa specyfikacja dla pliku znajdującego się w "app/views/api/users/_user.json.jbuilder", może być podobna do tej (spec/views/api/users/_user.json.jbuilder_spec.rb) :

require 'spec_helper' 

describe 'user rendering' do 
    let(:current_user) { User.new(id: 1, email: '[email protected]') } 

    before do 
    view.stub(:current_user).and_return(current_user) 
    end 

    it 'does something' do 
    render 'api/users/user', user: current_user 

    expect(rendered).to match('[email protected]') 
    end 
end 
1

To brzmi jak dobry użytek dla specyfikacji widoku RSpec. Czy używasz JBuilder do wyjścia kontrolera w widokach?

Na przykład w specyfikacji/views/venues_spec.rb

require 'spec_helper' 
describe "venues/show" do 
    it "renders venue json" do 
    venue = FactoryGirl.create(:venue) 
    assign(:venue, venue]) 
    render 
    expect(view).to render_template(:partial => "_venue") 
    venue_hash = JSON.parse(rendered) 
    venue_hash['id'].should == @venue.id 
    end 
end 
1

I nie były w stanie dokonać RSpec pracować z widokiem jeszcze, ale jestem testowania mój JSON API za pośrednictwem kontrolera testów RSpec. Aby pomóc w tym procesie, używam api matchers gem. Ten klejnot pozwala konstruować testy rspec takie jak:

it "should have a 200 code" do 
    get :list, :format => :json 
    response.should be_success 
    response.body.should have_json_node(:code).with("200") 
    response.body.should have_json_node(:msg).with("parameter missing") 
end 
1

nie lubię testowania API JSON poprzez poglądów, bo trzeba przede wszystkim naśladować, w teście, konfiguracja odbywa się już w sterowniku. Pomijając kontroler, naprawdę nie testujesz interfejsu API.

W testach kontrolerów jednak nie dostaniesz żadnego zwrotu JSON w treści odpowiedzi. Treść odpowiedzi jest pusta. Wynika to z faktu, że RSpec wyłącza renderowanie widoku w testach kontrolerów. (Na lepsze lub na gorsze).

Aby mieć test kontrolera RSpec dla widoku renderowanego interfejsu API JSON, należy dodać dyrektywę render_views u góry testu. Zobacz this blog post (nie moja), aby uzyskać bardziej szczegółowe informacje na temat używania testów kontrolera RSpec z JBolderem.

Zobacz także this answer.