3

私は、最終的にAPIのJSONデータを提供するjbuilderを使用して構築したテンプレートをテストするためのRSpecテストを作成しようとしています。コントローラの機能をテストするテストはたくさんspec/controllersありますが、jbuilderビューで正しいJSONフィールドをレンダリングしていることもテストしたいと思っています。これが私が設定したものの例です:

# app/views/api/v1/users/create.json.jbuilder
json.first_name user.first_name

# spec/views/api/v1/users/create.json.jbuilder_spec.rb
require 'spec_helper'
describe "api/v1/users/create.json.jbuilder" do
  it "renders first_name" do
    assign( :user, User.create( :first_name => "Bob" ) )
    render
    hash = JSON.parse( rendered )
    hash.has_json_node( :first_name ).with( "Bob" )
  end
end

実行するrspec spec/views/api/v1/users/create.json.jbuilder_spec.rbと次のエラーが発生します

Failures:

  1) api/v1/users/create.json.jbuilder render a user
     Failure/Error: render
     ActionView::Template::Error:
       undefined local variable or method `user' for #<#<Class:0x007fa2911c3118>:0x007fa29105f2b8>
     # ./app/views/api/v1/users/create.json.jbuilder:1:in `_app_views_api_v__users_create_json_jbuilder___3806288263594986646_70168098229960'
     # ./spec/views/api/v1/users/create.json.jbulder_spec.rb:6:in `block (2 levels) in <top (required)>'

userテンプレートにオブジェクトを割り当て/作成/渡す方法に関係なく、失敗します。私が間違っているかもしれない何か考えはありますか?

4

2 に答える 2

1

多くの読書と反復の後、これはうまくいくものです:

require 'spec_helper'
describe "api/v1/users/create.json.jbuilder" do

    let( :user )    { User.create( :not_strict => true ) }

    it "renders first_name" do
        render :template => "api/v1/users/create", :locals => { :user => user }, :formats => :json, :handler => :jbuilder
        rendered.should have_json_node( :first_name ).with( user.first_name )
    end
end

注:これはapi_matchersgemhave_json_nodeからのものです。

于 2012-10-11T19:49:48.527 に答える
0

メソッドセットインスタンス変数を割り当てます。ビューはuser.first_nameではなく@user.first_nameである必要がありますか、それとも部分的ですか?パーシャルの場合はrender:partial => ...を実行する必要があり、テンプレートの場合は@userを使用する必要があります

于 2012-10-16T00:32:03.693 に答える