在rails集成规范中向同一个控制器发出两个请求

时间:2011-10-21 14:11:32

标签: ruby-on-rails testing rspec

我在使用rspec

在rails集成测试中向同一个url发出两个请求时遇到问题
it 'does something' do

  # get '/something', {:status=>'any_other'}, @header ## <<<<< this line couses problem!

  get '/something', {:status=>'ok'}, @header
  doc = Nokogiri::HTML(response.body)
  lis = doc.css('#the_id')
  lis.size.should == 1
  lis[0].text.should include('anything')
end

如果我向同一个控制器发出两个请求,那么测试似乎保持旧响应......

在上面的示例中,如果我取消注释该行,则测试会中断,因为它会保留第一个“查询”的结果

是测试堆栈的限制,还是我做错了什么?

5 个答案:

答案 0 :(得分:2)

使用普通的旧Rails测试套件,功能测试适用于单个请求,如果您想测试流程,则应使用集成测试(您可以在功能测试中重置控制器)。

来自rspec-rails的控制器规范继承自Rails功能测试,因此它们具有相同的限制。您可以将rspec与capybara或webrat(我推荐前者)一起用于集成测试。

此外,rspec-rails的最新版本具有“请求规范”,“混合了Rails集成测试的行为”:https://github.com/rspec/rspec-rails

答案 1 :(得分:1)

应该编写

rails集成测试,以便on on case测试单个请求 - 响应周期。我们可以检查重定向。但如果你必须做类似的事情

获取'/ something',{:status =&gt;'any_other'},@ header

获取'/ something',{:status =&gt;'ok'},@ header

你应该为此写两个不同的案例。

答案 2 :(得分:1)

使用Capybara代替rspec是(请求)集成测试的更好解决方案。它使用与rspec相同的语法,并在单个块中允许多个请求。我使用rspec进行单元测试,使用capybara进行集成测试。

https://github.com/jnicklas/capybara

答案 3 :(得分:0)

您必须清除实例变量,或者可能是唯一必需的变量。 让我们假装您在控制器中使用@book

get '/something'
assert ...
controller.instance_variable_set(:@book, nil)
get '/something'
assert ...

如果您使用inherit_resources

get '/something'
assert ...
controller.send(:set_resource_ivar, nil)
get '/something'
assert ...

答案 4 :(得分:0)

我认为问题不在于您得到相同的响应,实际上是您两次发送相同的请求。

当我想在同一测试中提出两个请求时,以下内容对我有用: @request.delete_header 'RAW_POST_DATA'