RSpec存根仅适用于第一个请求,不适用于后续请求

时间:2015-07-10 23:14:03

标签: ruby-on-rails ruby testing rspec

我正在为我的应用编写请求规范,我遇到了多个请求的存根问题。

我的测试:

it "adding a text response element to the campaign" do
  TextResponsesController.any_instance.stub(:current_user).and_return(@user)

  get new_campaign_text_response_path(@campaign)
  expect(response).to render_template(:new)

  post "/campaigns/#{@campaign.id}/text_responses", { :text_response => {:name => "test", :campaign_id => @campaign.id, :keyword => @campaign.keyword, :message => "testing", :clip_id => Content::DEFAULT[1], :sender_name => "tester", :start_date => Time.now, :end_date => Time.now + 86400} }
  expect(@campaign.components.first.class).to equal TextResponse
end

在这个例子中,我在控制器的任何实例上存在:current_user方法,因此它可以模拟登录用户,否则它只会重定向到登录页面。

问题是,通过在每次请求后输出响应正文,我发现第一个get请求成功完成,但是post请求失败,因为它被重定向到登录页面。

我尝试过的事情:

1)注释掉get请求。这允许发布请求成功(不再重定向到登录页面)。

2)将两个请求放在单独的“it”块中,并在每个块中定义存根。没有区别,首先请求有效但第二个请求被重定向。

我很困惑,因为当只有一个请求时,存根显然正在工作,但是对于任何后续请求都没有。我一直试图解决这个问题一整天,我终于不知所措。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

终于发现了问题。

在test.rb中,config.cache_classes设置为false(不知道为什么因为它默认为true)。

您希望在测试环境中将config.cache_classes设置为true,否则将在每个请求上重新加载类,并且其方法将覆盖存根。