3

フロントエンドとしてバックボーンを使用して、Rails3.2で記述されたJSONAPIの一連のrspecテストを作成しようとしています。私が書いているテストは、特にRailsコントローラー用です。

これで、アプリケーション自体は正常に機能しています。クライアントが本体を使用してPUT要求を発行する場合:

{
  "id":1,
  "name":"updated product set",
  ...
}

すべてが素晴らしいです。バックグラウンドで、Railsはそのボディを取得し、次のように変換します。

{
  "id":1,
  "name":"updated product set",
  ...
  "model_name" => { ... }
}

ここで、ハッシュ「model_name」が指す属性値には、入力から自動的に把握できる属性値が含まれています。すべては順調です。

テスト環境からまったく同じリクエストを試してみると、すべてがうまくいきません。上記とまったく同じPUT本体ハッシュであるが、rspecでハッシュを作成する場合:

@update_json = {
  "id":1,
  "name":"updated product set",
  ...
}
header "Accept","application/json"
header "Content-type","application/json"
put :update, @update_json

物事はまったくうまくいきません。コントローラで、params変数を調べると、次のようになります。

{ "model_name" => {} }

「Content-type」ヘッダー行を省略すると、代わりに@update_jsonが取得されますが、コントローラーで必要な「model_name」マッピングを作成するRails操作はありません。

テストを成功させる唯一の方法は次のとおりです。

@update_json = {
  :format => "json",
  "id":1,
  "model_name" => {
      "id":1,
      "name":"updated product set",
      ...
  }
}
header "Accept","application/json"
put :update, @update_json

ただし、これは実際のテストではありません。これは、バックボーンフロントエンドによって送信される正確なPUT本体をテストしていないためです。

何か案は?

更新:周りを見渡すと、rspecから実際のHTTPリクエストを実際に行うことはできないようです。ただモックアップされています。たとえば、Railsは通常Railsネットワークスタックによってキャッチされて404に変換される例外をスローするため、システムに404で応答させることはできませんが、Rspecでは応答しません。したがって、問題は上記よりも深く見えます...

4

3 に答える 3

1

これを試してみませんか?

@update_json = {
  "id":1,
  "model_name" => {
      "id":1,
      "name":"updated product set",
      ...
  }
}
put :update, @update_json, :format => :json

編集(11/11/12):

リクエストを手動でインスタンス化して、何が起こるかを確認しようとしましたか?

変。「普通のルビーの道」に行こうとしたことがありますか?

env = Rack::MockRequest.env_for('/posts/1', :method => 'PUT', <some other params>)
status, headers, body = PostsController.action(:update).call(env)
...
于 2012-11-03T07:02:12.590 に答える
1

私も同じ問題を抱えていました。私が何をしたか、またはコンテンツタイプを「application / json」として指定した方法に関係なく、それは機能しませんでした。インターネット上でコンテンツタイプをjsonに設定する提案があった場合は、それを試してみました。私もそれらをすべて同時に試しました。

最終的に、私はそれをActionController :: ParamsWrapperにトレースしました。ここで、_wrapper_enabled?常にfalseを返していました(request.content_mime_typeがnilであるため)。この解決策は私のために働きます。私は同様に追加される「魔法の」paramsキーを探していました、そしてこれはそれをします。

mime_type = mock
mime_type.stub :ref => :json
request.stub :content_mime_type => mime_type
request.accept = 'application/json'
post :create, widget.as_json

値は次のとおりです。

widget.as_json #=> {
  "created_at"=>nil,
  "description"=>"Description 1 - Quidem nihil quae aliquid sed qui.",
  "id"=>nil,
  "order"=>1,
  "title"=>"Title 1 - ut",
  "updated_at"=>nil
}

# params hash in the controller.
params #=> {
  "created_at"=>nil,
  "description"=>"Description 1 - Quidem nihil quae aliquid sed qui.",
  "id"=>nil,
  "order"=>"1",
  "title"=>"Title 1 - ut",
  "updated_at"=>nil,
  "controller"=>"api/widgets",
  "action"=>"create",
  "widget"=>{
    "title"=>"Title 1 - ut",
    "order"=>"1",
    "description"=>"Description 1 - Quidem nihil quae aliquid sed qui."
  }
}

これはまさに私が欲しかったものです。タイトル、順序、説明のみがattr_accessibleとして設定されているため、魔法のように作成された:widgetハッシュに表示される属性のみです。

私もactive_model_serializersを使用しているので、誰かがそれが重要だと思う場合に備えて、as_jsonがそれを実行しています。

これは私が作成している公開サンプルアプリの一部であるため、このコードが役立つと思われる場合は、このコードが使用されていることを確認できます。

于 2013-01-25T06:13:17.300 に答える
1

post :update, '{"some": "json"}'このコミットでrspecが使用する内部ActionPacktest_case.rbに 実行機能が追加されたようです: https ://github.com/rails/rails/commit/5b9708840f4cc1d5414c64be43c5fc6b51d4ecbf

したがって、他のオプションとして、Rails 4にアップグレードして期待どおりに機能させるか、上記のコミットを統合することが考えられます。

于 2014-02-13T16:36:05.127 に答える