2

私はこれに数時間苦労しています。Rack::Test を使用して、Rails 3.2 アプリの API テストを作成しています。

私が何をしても、last_response の本文は空です (具体的には「{}」なので 2 文字です)。

テストは次のとおりです。

describe "updating a product set with JSON" do
  def app
    ProductSetsController.action(:update)
  end

  let(:update_json) { ... }

  before do
    @product_set = FactoryGirl.build(:product_set)
  end
  it { @failures.should == 0 }

  it "should not increment the product set count" do
    expect { put :update, update_json }.to_not change(ProductSet, :count).by(1)
  end

  it "should increment the conditions count" do
    expect { put :update, update_json }.to change(@product_set.conditions, :count).by(2)
  end

  context "response should be valid" do
    before do
      put :update, update_json
    end
    subject { last_response }
    it { should be_ok }
  end
end

これらすべてのテストに合格します。でも体は空っぽ。

奇妙なことは、実際のアプリケーションを実行すると、応答本文が確実に空ではないことです。更新された product_set に関する JSON があります。

だから私はどういうわけかテストを間違って設定しています。Rack::Test を使用するのはこれが初めてなので、本当にばかげたことを見落としているに違いありません。何かご意見は?

リクエストヘッダーを正しく設定していない可能性があると思いました。生成には RABL も使用しています。

更新: 問題は確かに RABL にあります。まだ解決策を見つけていませんが、使用する場合:

respond_with(@product_set.update_attributes(get_properties(params)),
  file: 'app/views/product_sets/update.json.rabl', :handlers => [:rabl])

それ以外の:

respond_with(@product_set.update_attributes(get_properties(params)))

次に、テストで機能しますが、両方とも開発または本番で機能します。また、Gemfile の問題ではないことを確認しました。

4

1 に答える 1

2

答えを見つけました。つまり、ビューが正しくレンダリングされるように、rspec ドキュメントのルート記述ブロックの先頭でキーワード「render_views」を必ず使用してください。

これは役立つ記事でした: https://github.com/nesquena/rabl/wiki/Testing-with-rspec

于 2012-09-18T23:26:11.300 に答える