私はこれに数時間苦労しています。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 の問題ではないことを確認しました。