黄瓜场景使用红宝石在文件中搜索

时间:2012-01-04 04:00:20

标签: file-io cucumber

我有一个黄瓜场景,它检查文件中的某些字符串。不是一种非常理想的做事方式,但它被视为绝对需要。

我的黄瓜情景有一个表格:

电子邮件应该

|search_string|
|Nokogiri     |
|Cucumber     |
|White Tiger  |

我的步骤定义

Given /^the email should have$/ do |table|
  table.hashes.each do |hash|
    check_email(hash["search_string"])
  end
end

我的check_email方法

require 'nokogiri'

def check_email(search_string)
  htmlFile = File.open(filename).read
  doc = Nokogiri::HTML::DocumentFragment.parse(htmlFile)
  if (doc.content["#{search_string}"])
    puts true
    return true
  end
  htmlFile.close
  puts false
  return false
end

我正在阅读的文件虽然是“.txt”文件扩展名,但文件中的内容是HTML格式。

  1. 该方法正在读取正确的文件
  2. 该文件包含该方法试图找到的内容
  3. 现在谈到我所看到的实际问题。

    1. 我黄瓜场景中的search_string有3个要搜索的值。文件中没有“白虎”
    2. 由于“白虎”不在文件中,测试应该失败,而是测试通过/我应该说我看到“绿色”,当我在代码中输出上面的实际结果时它清楚地显示(对于Nokogiri,对黄瓜来说是真的,对白虎来说是假的。)
    3. 我的问题是如何做到这一点。黄瓜表结果应仅对文件中可用的值显示GREEN / PASS,对于不在文件中的值显示RED / FAIL。

      有人可以帮我解决这个问题。提前欣赏。

2 个答案:

答案 0 :(得分:1)

除非引发异常,否则黄瓜不会失败一步(这是当RSpec匹配器不满意时会发生的情况)。简单地返回真或假是没有意义的。

你的断言应该看起来像

if (!doc.content["#{search_string}"])
    raise "Expected the file to contain '#{search_string}'"
end

答案 1 :(得分:0)

如果您想按原样使用check_email函数,可以在步骤定义中添加断言:

Given /^the email should have$/ do |table|
  table.hashes.each do |hash|
    check_email(hash["search_string"]).should be_true
  end
end

您也可以让您的电子邮件功能返回一个字符串,并在步骤定义中检查其内容:

require 'nokogiri'

def email_contents
  html = IO.read(filename)
  doc  = Nokogiri::HTML::DocumentFragment.parse(html)
  return doc.content
end

# ...

Given /^the email should have$/ do |table|
  contents = email_contents

  table.hashes.each do |hash|
    contents.should include(hash["search_string"])
  end
end

这些并不比Jon M的方法更好或更差 - 只是另一种选择。