ruby-on-railsunit-testingrspecjbuilder

How to use RSpec with JBuilder?


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?


Solution

  • 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: '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