在Rack :: Test rspec测试中,last_response.body为空(但实际应用中没有)

时间:2012-09-18 18:57:20

标签: ruby-on-rails

我现在已经挣扎了好几个小时了。我正在使用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问题。

1 个答案:

答案 0 :(得分:2)

找到答案。简而言之,请确保在rspec文档的根描述块顶部使用关键字“render_views”,以确保正确呈现视图。

这是一篇有用的文章: https://github.com/nesquena/rabl/wiki/Testing-with-rspec