How to use RSpec with JBuilder?

beeudoublez picture beeudoublez · Mar 30, 2012 · Viewed 7.5k times · Source

I'm looking for a clean way to use JBuilder and test the json output with RSpec. The popular way for JSON testing is to implement the as_json method, and then in RSpec compare the received object with the object.to_json method. But a large reason I'm using JBuilder is that I don't want all the attributes that to_json spits out; so this breaks comparison.

Currently with JBuilder I'm having to do the following to test the RSpec results:

1) Create a Factory object: @venue

2) Create a hash inside my RSpec test that contains the "expected" JSON string back

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

2) Compare the @expected string to the results.response.body that is returned from the JSON call.

This seems simple, except I have objects being rendered with 15+ attributes, and building the @expected hash string is cumbersome and very brittle. Is there a better way to do this?

Answer

Oriol Gual picture Oriol Gual · Mar 5, 2013

You should be able to test your Jbuilder views with RSpec views specs. You can see the docs at https://www.relishapp.com/rspec/rspec-rails/v/2-13/docs/view-specs/view-spec.

An example spec for a file located at 'app/views/api/users/_user.json.jbuilder', could be something like this (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