2015-07-10 222 views
0

我正在为我的应用程序编写请求规格,并且遇到多个请求的stubbing问题。RSpec stubbing只适用于第一次请求,不适用于后续请求

我的测试:

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方法在控制器的任何实例,因此它可以模拟登录的用户,否则就只是重定向到登录页面。

问题是,通过在每次请求后输出响应主体,我发现第一个获取请求已成功完成,但发布请求因为重定向到登录页面而失败。

我试过的东西:

1)评论取出请求。这允许发布请求成功(不再重定向到登录页面)。

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

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

任何帮助将不胜感激。

+0

如果您在同一个块中执行两个'get'请求,它会失败吗? –

+0

是的,如果我做了两个获取请求,第二个获得重定向。我在控制器中输出了current_user,看起来第二个请求总是导致current_user为零,这意味着stubbing不能正常工作......或者我不理解它是如何工作的?我输出了正在调用current_user的类名,它是两个请求的正确控制器。 –

回答

0

终于发现了这个问题。

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

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

相关问题