2012-03-30 30 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