Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 轨道&x2B;RSpec+;在运行RSpec测试套件时设置测试用例文件的顺序_Ruby On Rails_Selenium_Testing_Rspec_Capybara - Fatal编程技术网

Ruby on rails 轨道&x2B;RSpec+;在运行RSpec测试套件时设置测试用例文件的顺序

Ruby on rails 轨道&x2B;RSpec+;在运行RSpec测试套件时设置测试用例文件的顺序,ruby-on-rails,selenium,testing,rspec,capybara,Ruby On Rails,Selenium,Testing,Rspec,Capybara,对于rspeccapybara测试用例[Selenium],我有大约7到8个规范文件。很少有测试用例是相互依赖的。例如,在删除产品之前,我必须创建产品 但是当测试用例执行开始时,删除基于产品的rspec会在创建产品rspec之前运行 文件名:- product_delete.rspec product_listing.rspec 新添加的产品。rspec 命令:rspec 根文件夹中的.rspec文件 --require spec_helper --format html --out ./log

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

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

文件名:-

product_delete.rspec

product_listing.rspec

新添加的产品。rspec

命令:rspec

根文件夹中的.rspec文件

--require spec_helper
--format html
--out ./log/rspec_results.html
--color
执行删除产品时测试用例失败


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

测试用例应该是独立的。对于删除测试用例,您可以使用factory创建一条记录,然后在单个测试用例中删除它,如示例所示。 只需定义一次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

测试用例应该是独立的。对于删除测试用例,您可以使用factory创建一条记录,然后在单个测试用例中删除它,如示例所示。 只需定义一次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

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

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

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

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

  • 正如大多数/所有其他答案所提到的,您的测试应该是独立的,并且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
    
    您可以检查数据库内容,而不是重新访问产品路径,但是在特性测试中直接查询数据库通常是一种不好的味道,因为它将用户体验与实现细节结合起来


    如果在Rails<5.1中使用具有JS功能的驱动程序,您可能需要安装database_cleaner并关闭JS测试的事务模式-和。在Rails 5.1+中,DB连接在应用程序和测试之间共享,因此您通常可以启用事务测试,而不需要数据库清理器。

    正如大多数/所有其他答案所提到的,您的测试应该是独立的,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
    
    您可以检查数据库内容,而不是重新访问产品路径,但是在特性测试中直接查询数据库通常是一种不好的味道,因为它将用户体验与实现细节结合起来


    如果在Rails<5.1中使用具有JS功能的驱动程序,您可能需要安装database_cleaner并关闭JS测试的事务模式-和。在Rails 5.1+中,DB连接在应用程序和测试之间共享,因此您通常可以启用事务测试,而不需要数据库清理器。

    测试用例应该是独立的。顺序相关的测试是一种代码味道。@同意,但在这里,如果我试图执行单个删除测试用例,那么我必须在相同的测试用例中编写产品的创建。在这种情况下,将违反DRY。测试必须是潮湿的,代码必须是干燥的。要维护代码,首先需要理解代码@非常好。正确的观点。不过,如果有人能建议重新安排序列,那么我相信这会很好。每个人都面临这样的问题。可能任何人都有这个建议。测试用例应该是独立的。顺序相关的测试是一种代码味道。@同意,但在这里,如果我试图执行单个删除测试用例,那么我必须在相同的测试用例中编写产品的创建。在这种情况下,将违反DRY。测试必须是潮湿的,代码必须是干燥的。要维护代码,首先需要理解代码@非常好。正确的观点。不过,如果有人能建议重新安排序列,那么我相信这会很好。每个人都面临这样的问题。可能任何战士都有这个建议。伙计,这是一个硒测试用例。忘了提到这个问题。谢谢你的提醒。@Rubyist不管你有什么样的测试。这个例子只是描述了这个方法,并且做到了这一点properly@chumakoff:他的意思可能是,在本例中,服务器在一个单独的进程中运行,并且没有从该进程中看到工厂构建的对象(因为事务隔离)。所以,是的,“测试类型”可能很重要。@SergioTulentsev虽然selenium在单独的进程中运行firefox/chrome/etc,但Capybara(默认情况下)在单独的线程(而不是进程)中运行应用服务器。在Rails<5.1中,这需要运行类似database_cleaner的东西,而不是在tra中运行