2012-03-30 32 views
6

Tôi đang tìm cách sạch sẽ để sử dụng JBuilder và kiểm tra đầu ra json bằng RSpec. Cách phổ biến để thử nghiệm JSON là thực hiện phương thức as_json, và sau đó trong RSpec, hãy so sánh đối tượng đã nhận với phương thức object.to_json. Nhưng một lý do lớn mà tôi đang sử dụng JBuilder là tôi không muốn tất cả các thuộc tính mà to_json khạc ra; vì vậy điều này phá vỡ so sánh.Làm thế nào để sử dụng RSpec với JBuilder?

Hiện nay với JBuilder Tôi phải làm như sau để kiểm tra kết quả RSpec:

1) Tạo một đối tượng Factory: @venue

2) Tạo một băm bên trong kiểm tra RSpec của tôi có chứa chuỗi JSON "dự kiến" trở lại

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

2) So sánh chuỗi bất ngờ với results.response.body được trả về từ cuộc gọi JSON.

Điều này có vẻ đơn giản, ngoại trừ tôi có đối tượng được hiển thị với hơn 15 thuộc tính và xây dựng chuỗi băm không mong muốn là cồng kềnh và rất giòn. Có cách nào tốt hơn để làm điều này?

+0

Tôi đã làm chính xác điều đó. Tôi không thể nghĩ ra cách tốt hơn để làm điều đó. Tôi đã tạo một băm và áp dụng '.to_json' trên' @ expected'. Một điều tôi làm tăng tốc độ này và làm cho nó ít giòn hơn. Có lẽ với chi phí chính xác? Là để xây dựng băm của tôi với thu thập và bản đồ. Tôi đoán bản chất cụ thể của việc xây dựng mẫu tùy chỉnh với bất kỳ thư viện xây dựng chuỗi JSON nào yêu cầu bạn viết một bài kiểm tra phù hợp với các chi tiết cụ thể của công việc bạn làm ..:/ – stuartc

+0

@beeudoublez Bạn có thể sử dụng RSpec để kiểm tra xem jbuilder không? Tôi đang gặp khó khăn khi nhận rspec để truyền các đối tượng cho khung nhìn để trình xử lý jbuilder xây dựng JSON. Bạn có ví dụ về tệp '* _spec.rb' đang hoạt động không? – sorens

Trả lời

4

Bạn sẽ có thể kiểm tra chế độ xem Jbuilder với thông số kỹ thuật lượt xem RSpec. Bạn có thể xem tài liệu tại số https://www.relishapp.com/rspec/rspec-rails/v/2-13/docs/view-specs/view-spec.

Ví dụ về một tệp nằm ở 'app/views/api/users/_user.json.jbuilder', có thể giống như thế này (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

Điều này nghe có vẻ giống như một trường hợp sử dụng tốt cho thông số kỹ thuật xem RSpec. Bạn đang sử dụng JBuilder cho đầu ra của một bộ điều khiển trong khung nhìn?

Ví dụ, trong spec/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

tôi đã không thể làm cho RSpec làm việc với các quan điểm nêu ra, nhưng tôi đang thử nghiệm API JSON của tôi qua bộ điều khiển kiểm tra RSpec. Để hỗ trợ quá trình này, tôi đang sử dụng api matchers gem. Đá quý này cho phép bạn xây dựng các thử nghiệm RSpec như:

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

Tôi không thích kiểm tra API JSON thông qua các chế độ xem, bởi vì bạn phải cơ bản bắt chước, trong thử nghiệm, thiết lập đã được thực hiện trong bộ điều khiển. Ngoài ra, bỏ qua bộ điều khiển, bạn không thực sự kiểm tra API.

Trong kiểm tra bộ điều khiển, tuy nhiên, bạn sẽ thấy rằng bạn không nhận được bất kỳ JSON nào được trả về trong phần phản hồi. Nội dung phản hồi trống. Điều này là do RSpec vô hiệu hóa hiển thị xem trong kiểm tra bộ điều khiển. (Để tốt hơn hoặc tệ hơn.)

Để kiểm tra bộ điều khiển RSpec của chế độ xem của bạn đã hiển thị JSON API, bạn phải thêm chỉ thị render_views vào đầu thử nghiệm của mình. Xem this blog post (không phải của tôi), để biết thêm thông tin chi tiết về việc sử dụng các kiểm tra bộ điều khiển RSpec với Jbuilder.

Ngoài ra, hãy xem this answer.

Các vấn đề liên quan