10

JBuilderを使用して RSpec で json 出力をテストするクリーンな方法を探しています。JSON テストの一般的な方法は、as_json メソッドを実装し、RSpec で受け取ったオブジェクトを object.to_json メソッドと比較することです。しかし、私が JBuilder を使用している大きな理由は、to_json が吐き出すすべての属性が必要ないからです。したがって、これは比較を破ります。

現在、JBuilder では、RSpec の結果をテストするために次のことを行う必要があります。

1) Factory オブジェクトを作成します: @venue

2) 「期待される」JSON 文字列を含むハッシュを RSpec テスト内に作成します。

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

2) @expected 文字列を、JSON 呼び出しから返された results.response.body と比較します。

これは単純に思えますが、オブジェクトが 15 以上の属性でレンダリングされており、@expected ハッシュ文字列を作成するのは面倒で非常に脆弱です。これを行うより良い方法はありますか?

4

5 に答える 5

8

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
于 2013-03-05T13:35:50.067 に答える
6

ビューを介して JSON API をテストするのは好きではありません。テストでは、コントローラーで既に行われているセットアップを本質的に模倣する必要があるためです。また、コントローラーをバイパスすると、実際には API をテストしていません。

ただし、コントローラーのテストでは、応答本文で JSON が返されないことがわかります。応答本文が空です。これは、RSpec がコントローラー テストでのビュー レンダリングを無効にするためです。(良くも悪くも。)

JSON API をレンダリングしたビューの RSpec コントローラー テストを行うにはrender_views、テストの先頭にディレクティブを追加する必要があります。Jbuilder で RSpec コントローラー テストを使用する方法の詳細については、このブログ投稿(私のものではありません)を参照してください。

また、この回答を参照してください。

于 2016-10-30T20:14:23.330 に答える
3

まだビューでRSpecを機能させることはできませんが、コントローラーのRSpecテストを介してJSONAPIをテストしています。このプロセスを支援するために、私はapimatchersgemを使用しています。この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
于 2012-10-11T04:23:40.893 に答える
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
于 2012-09-11T19:45:24.683 に答える