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

我在使用rspec在rails集成测试中向同一个url发出两个请求时遇到问题

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

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

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

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

应编写rails集成测试,以便on on case测试单个请求 – 响应周期。 我们可以检查重定向。 但如果你必须这样做的话

得到’/ something’,{:status =>’any_other’},@ head

得到’/ something’,{:status =>’ok’},@ head

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

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

https://github.com/jnicklas/capybara

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

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

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

您必须清除实例变量,或者可能是唯一必需的变量。 我们假装您在控制器中使用@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 ...