Как использовать RSpec с JBuilder? - PullRequest
6 голосов
/ 30 марта 2012

Я ищу чистый способ использования JBuilder и проверки вывода json с помощью RSpec.Популярный способ тестирования JSON - реализовать метод as_json, а затем в RSpec сравнить полученный объект с методом object.to_json.Но большая причина, по которой я использую JBuilder, заключается в том, что мне не нужны все атрибуты, которые выдает to_json;так что это разрывы сравнения) Создайте хеш внутри моего теста RSpec, который содержит «ожидаемую» строку JSON назад

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

2) Сравните строку @expected с results.response.body, которое возвращается из вызова JSON.*

Это кажется простым, за исключением того, что у меня есть объекты, визуализируемые с более чем 15 атрибутами, а построение строки хеша @expected громоздко и очень хрупко.Есть ли лучший способ сделать это?

Ответы [ 4 ]

5 голосов
/ 05 марта 2013

Вы должны быть в состоянии протестировать ваши представления Jbuilder со спецификациями представлений RSpec. Вы можете увидеть документы на 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
2 голосов
/ 30 октября 2016

Мне не нравится тестировать JSON API с помощью представлений, потому что в тесте вы должны имитировать настройку, уже выполненную в контроллере. Кроме того, обходя контроллер, вы на самом деле не тестируете API.

Однако в тестах контроллера вы обнаружите, что в теле ответа не возвращается JSON. Тело ответа пусто. Это связано с тем, что RSpec отключает визуализацию представлений в тестах контроллера. (К лучшему или к худшему.)

Чтобы тест контроллера RSpec для вашего представления отображал JSON API, вы должны добавить директиву render_views в верхней части теста. См. этот блог (не мой), для получения более подробной информации об использовании тестов контроллера RSpec с Jbuilder.

Также см. этот ответ .

2 голосов
/ 11 октября 2012

Я пока не смог заставить RSpec работать с представлениями, но я тестирую свой JSON API с помощью контроллеров RSpec.Чтобы помочь с этим процессом, я использую гем api matchers .Этот гем позволяет вам создавать тесты 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 голос
/ 11 сентября 2012

Это звучит как хороший пример использования спецификаций 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
...