Rails + RSpec +在运行RSpec Test Suite时设置测试用例文件的顺序

时间:2017-09-29 04:53:52

标签: ruby-on-rails selenium testing rspec capybara

对于RSpec Capybara测试用例[Selenium],我有大约7到8个spec文件。很少有测试用例相互依赖。例如,在删除产品之前,我必须创建产品。

但是当测试用例开始执行时,删除基于产品的rspec在创建产品rspec之前运行。

文件名: -

  

product_delete.rspec

     

product_listing.rspec

     

product_newly_added.rspec

命令:rspec

根文件夹中的

.rspec文件

--require spec_helper
--format html
--out ./log/rspec_results.html
--color

执行删除产品时测试用例失败。

有没有办法在运行RSpec时定义文件执行顺序。

3 个答案:

答案 0 :(得分:1)

测试用例应该是独立的。对于删除测试用例,您可以使用factory并创建记录,然后在单个测试用例中将其删除,如示例所示。 只需定义一次工厂并使用它来创建记录,这样就不会违反DRY。

describe 'POST destroy' do
 before(:each) do
  @obj = build(:factory_name)
  @obj.save
 end

 it 'it has status 200' do
  post :destroy, {"id" => @obj.id}
  expect(ClassOfObj.count).to eq(0)
 end
end

答案 1 :(得分:1)

一种可能的方法是不将这些操作分成他们自己的测试用例。使用功能规格可以测试整个功能,而不是单个按钮。因此,您的测试可能如下所示:

  1. 导航到新项目页面。确保显示表单
  2. 填写表格。点击提交。验证屏幕上是否显示成功消息。
  3. 确认您已被重定向到项目索引页面。验证页面上是否确实存在新创建的项目。
  4. 点击“删除”按钮。
  5. 确认您在索引页面上并且该项目不再显示。

答案 2 :(得分:0)

正如大多数/所有其他答案所提到的,您的测试应该是独立的,并且RSpec支持以随机顺序运行测试以保证这一点。在这些条件下实施测试的最简单方法之一是使用工厂来创建测试数据(FactorGirl等)。在这种情况下,您最终会按照

的方式进行测试
feature "deleting of products" do
  scenario "removes last product" do
     create(:product) # Use factory to create one product
     visit products_path 
     expect(page).to have_css('div.product', count: 1) # verify there is only one product shown on the page
     click_link('delete') # click the delete button
     expect(page).to have_text("Product deleted!") # check for a visible change that indicates deletion has completed        
     visit products_path
     expect(page).not_to have_css('div.product') # No products shown any more - you may need to expect for something else first if the products are dynamically loaded to the page to ensure that has completed
  end
end

您可以检查数据库内容而不是重新访问products_path,但在功能测试中直接进行数据库查询通常是一种难闻的气味,因为它将用户体验与实现细节相结合。

如果在Rails中使用它< 5.1使用支持JS的驱动程序,您可能需要安装database_cleaner并关闭JS测试的事务模式 - https://github.com/teamcapybara/capybara#transactions-and-database-setuphttps://github.com/DatabaseCleaner/database_cleaner#rspec-with-capybara-example。在Rails 5.1+中,数据库连接在应用程序和测试之间共享,因此您通常可以启用事务测试并且不需要database_cleaner。