TL;DR
In this post I will explain how to handle cucumber tables in the “Do not repeat yourself [source]” principle.
Data Tables are handy for passing a list of values to a step definition:
Given the following users exist: | name | email | twitter | | Aslak | aslak@cucumber.io | @aslak_hellesoy | | Julien | julien@cucumber.io | @jbpros | | Matt | matt@cucumber.io | @mattwynne |
Here is my first take how to index that data that was not DRY:
class UserListPage include PageObject data_map = {'name => 1, 'email' => 2, 'twitter' => 3} div(:name, :id => 'name') div(:email, :id => 'email') div(:twitter, :id => 'twitter') end
And using that data_map in step definition:
Given /^the following users exist:$/ do |table| data = table.raw[1] data.shift on UserListPage do |page| data.each {|row| expect(page.name).to eq row[page.data_map['name']] expect(page.email).to eq row[page.data_map['email']] expect(page.twitter).to eq row[page.data_map['twitter']] end end
There is no need for data_map attribute, because table object already has this data. Dry version:
Given /^the following users exist:$/ do |table| data = table.raw[1] header = table.raw[0] data.shift on UserListPage do |page| data.each {|row| expect(page.name).to eq row[header.index('name')] expect(page.email).to eq row[header.index('email')] expect(page.twitter).to eq row[header.index('twitter')] end end
And do not forget to remove data_map attribute from page object class.