2012-03-30 57 views
6

我正在尋找一種乾淨的方式來使用JBuilder並使用RSpec測試json輸出。 JSON測試的常用方法是實現as_json方法,然後在RSpec中將接收到的對象與object.to_json方法進行比較。但是我使用JBuilder的一個重要原因是我不想要to_json吐出的所有屬性;所以這打破了比較。如何在JBuilder中使用RSpec?

用JBuilder的

目前我在做以下測試RSpec的結果:

1)創建一個工廠對象:@venue

2)創建一個散列我的RSpec的測試裏面包含「expected」JSON string back

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

2)將@expected字符串與從JSON調用返回的results.response.body進行比較。

這看起來很簡單,除了我有15+屬性呈現對象,並且構建@expected哈希字符串很麻煩而且非常脆弱。有一個更好的方法嗎?

+0

我一直在做這件事。我想不出一個更好的方法來做到這一點。 我構建了一個散列並在'@ expected'上應用'.to_json'。 我做的一件事就是加快速度,讓它變脆。也許是以犧牲準確性爲代價的? 是用集合和地圖來構建我的哈希。 我想用任何JSON字符串構建庫構建自定義模板的特定性質需要你編寫一個測試來匹配你所做的工作的細節..:/ – stuartc 2012-07-09 09:38:05

+0

@beeudoublez你能夠使用RSpec來測試jbuilder視圖嗎?我無法讓rspec將對象傳遞給視圖,以便jbuilder處理程序構造JSON。你有一個工作視圖'* _spec.rb'文件的例子嗎? – sorens 2012-10-11 04:20:12

回答

4

你應該能夠用RSpec視圖規格測試你的Jbuilder視圖。你可以在https://www.relishapp.com/rspec/rspec-rails/v/2-13/docs/view-specs/view-spec看到文檔。

位於'app/views/api/users/_user.json.jbuilder'的文件的示例規範可能是這樣的(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

這聽起來像是RSpec視圖規範的一個很好的用例。您是否在視圖中使用JBuilder作爲控制器的輸出?

例如,在規格/視圖/ 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

我一直沒能做出RSpec的與視圖的工作還沒有,但我通過控制器RSpec的測試測試我的JSON API。爲了協助這個過程,我使用了api matchers gem。這個寶石可以讓你構建RSpec測試,例如:

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

我不喜歡通過視圖測試JSON API,因爲在測試中,必須基本模仿已經在控制器中完成的設置。此外,繞過控制器,你不是真的測試API。

但是,在控制器測試中,您會發現在響應正文中沒有返回任何JSON。響應主體爲空。這是因爲RSpec禁用控制器測試中的視圖渲染。 (好或壞)

爲了讓您的視圖的RSpec控制器測試呈現JSON API,您必須在測試頂部添加render_views指令。有關在Jbuilder中使用RSpec控制器測試的更多詳細信息,請參閱this blog post(不是我的)。

另外,參見this answer