我正在寻找一种干净的方法来使用JBuilder并使用RSpec测试json输出。 JSON测试的流行方式是实现as_json方法,然后在RSpec中将接收到的对象与object.to_json方法进行比较。但是我使用JBuilder的一个重要原因是我不想要to_json吐出的所有属性;所以这打破了比较。
目前使用JBuilder我必须执行以下操作来测试RSpec结果:
1)创建一个Factory对象:@venue
2)在我的RSpec测试中创建一个包含“预期的”JSON字符串
的哈希@expected => {:id => @venue.id,:name=>@venue.name..........}
2)将@expected字符串与从JSON调用返回的results.response.body进行比较。
这看起来很简单,除了我用15个以上的属性渲染对象,并且构建@expected哈希字符串很麻烦且非常脆弱。有更好的方法吗?
答案 0 :(得分:5)
您应该能够使用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: 'foo@bar.com') }
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('foo@bar.com')
end
end
答案 1 :(得分:2)
我还没有能够使RSpec与视图一起工作,但我正在通过控制器RSpec测试来测试我的JSON API。为了帮助完成此过程,我使用的是api matchers gem。这个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
答案 2 :(得分:2)
我不喜欢通过视图测试JSON API,因为在测试中,您必须基本上模仿控制器中已经完成的设置。此外,绕过控制器,您还没有真正测试API。
然而,在控制器测试中,您会发现您没有在响应正文中返回任何JSON。响应正文是空的。这是因为RSpec在控制器测试中禁用了视图渲染。 (无论好坏。)
为了对视图呈现的JSON API进行RSpec控制器测试,您必须在测试的顶部添加render_views
指令。有关在Jbuilder中使用RSpec控制器测试的更多详细信息,请参阅this blog post(不是我的)。
另请参阅this answer。
答案 3 :(得分:1)
这听起来像是RSpec视图规范的一个很好的用例。您是否在视图中使用JBuilder输出控制器?
例如,在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