代码之家  ›  专栏  ›  技术社区  ›  user1523236

使用rspec处理数据驱动测试中的故障

  •  0
  • user1523236  · 技术社区  · 8 年前

    我正在使用rspec进行一些数据驱动测试。我的测试读取csv文件,获取一个条目,该条目插入到页面的文本框中,然后与同样从csv文件读取的预期文本进行比较。所有这些都按预期工作,我能够阅读和比较,没有任何问题。

    下面是我的代码:

    读取csv文件的方法:

       def user_data
          user_data = CSV.read Dir.pwd + '/user_data.csv'
          descriptor = user_data.shift
          descriptor = descriptor.map { |key| key.to_sym }
          user_data.map { |user| Hash[ descriptor.zip(user) ] }
        end
    

    测试:

    describe "Text box tests" do
    
      before :all do
        @homepage = Homepage.new
      end
    
      it "should display the correct name" do
        visit('http://my test url')
        sleep 2
        user_data.each do |entry|
          @homepage.enter_name(entry[:name])
          @homepage.click_go()
          sleep 2
          begin
            expect(page).to have_css("#firstname", text: entry[:expected_name])
          end
        end
      end
    end
    

    问题在于失败。如果其中一个测试失败(即预期文本未显示在页面上),则测试停止,csv中的所有后续条目均未测试。如果我在expect声明之后进行营救:

       rescue Exception => error
         puts error.message
    

    然后错误被记录到控制台,但是在我的测试运行结束时,它表示没有失败。

    因此,基本上,我要寻找的是,如果我的测试无法继续运行(直到csv中的所有条目都被覆盖),但测试运行会被标记为失败。有人知道我怎样才能做到这一点吗?

    2 回复  |  直到 8 年前
        1
  •  2
  •   Panic    8 年前

    尝试以下操作:

    context "when the user is on some page" do
      before(:context) { visit('http://example.org/') }
    
      user_data.each do |entry|
        it "should display the correct name: #{entry[:name]}" do
          @homepage.enter_name(entry[:name])
          @homepage.click_go
    
          expect(page).to have_css("#firstname", text: entry[:expected_name])
        end
      end
    end
    

    您还需要更改 def user_data def self.user_data

        2
  •  1
  •   max pleaner    8 年前

    我建议对条目进行映射并调用常规的capybara方法 has_css? 而不是rspec helper方法。看起来是这样的:

    results = user_data.map do |entry|
      @homepage.enter_name(entry[:name])
      @homepage.click_go()
      sleep 2
      page.has_css?("#firstname", text: entry[:expected_name])
    end
    
    expect(results.all?) to be_truthy
    

    如果要跟踪哪些失败,可以稍加修改:

    missing_entries = []
    user_data.each do |entry|
      @homepage.enter_name(entry[:name])
      @homepage.click_go()
      sleep 2
      has_entry = page.has_css?("#firstname", text: entry[:expected_name])
      unless has_entry
        missing_entries.push entry[:expected_name]
      end
    end
    
    expect(missing_entries).to be_empty