我正在使用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中的所有后续条目。如果我按照这样的期望声明进行救援:
rescue Exception => error
puts error.message
然后将错误记录到控制台,但是在测试运行结束时,它表示没有失败。
所以基本上我正在寻找的是,如果我的测试失败继续运行(直到csv中的所有条目都被覆盖),但是测试运行被标记为失败。有谁知道我怎么能做到这一点?
答案 0 :(得分:1)
我建议映射条目并调用常规的capybara方法has_css?而不是rspec辅助方法。它看起来像这样:
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
答案 1 :(得分:1)
尝试这样的事情:
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