对于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时定义文件执行顺序。
答案 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)
一种可能的方法是不将这些操作分成他们自己的测试用例。使用功能规格可以测试整个功能,而不是单个按钮。因此,您的测试可能如下所示:
答案 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-setup和https://github.com/DatabaseCleaner/database_cleaner#rspec-with-capybara-example。在Rails 5.1+中,数据库连接在应用程序和测试之间共享,因此您通常可以启用事务测试并且不需要database_cleaner。