我在使用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
如果我向同一个控制器发出两个请求,那么测试似乎保持旧响应......
在上面的示例中,如果我取消注释该行,则测试会中断,因为它会保留第一个“查询”的结果
是测试堆栈的限制,还是我做错了什么?
答案 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进行集成测试。
答案 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'