Read more

Cucumber step to match table rows with Capybara

Henning Koch
October 05, 2010Software engineer at makandra GmbH

These steps are now part of Spreewald.

Illustration book lover

Growing Rails Applications in Practice

Check out our e-book. Learn to structure large Ruby on Rails codebases with the tools you already know and love.

  • Introduce design conventions for controllers and user-facing models
  • Create a system for growth
  • Build applications to last
Read more Show archive.org snapshot

This note describes a Cucumber step that lets you write this:

Then I should see a table with the following rows:
  | Bruce Wayne       | Employee    | 1972 |
  | Harleen Quinzel   | HR          | 1982 |
  | Alfred Pennyworth | Engineering | 1943 |

If there are additional columns or rows in the table that are not explicitely expected, the step won't complain. It does however expect the rows to be ordered as stated. If you don't like this, you can append "... in any order":

Then I should see a table with the following rows in any order:
  | Bruce Wayne       | Employee    | 1972 |
  | Harleen Quinzel   | HR          | 1982 |
  | Alfred Pennyworth | Engineering | 1943 |

You can find the step definition below.

Exact matches

If you do not want to match tables that have additional rows, you can use

Then I should see a table with exactly the following rows:
  ...

Testing tables with colspan or rowspan

Cucumber tables are required to have the same number of cells in every row. This is unfortunate when testing a table that uses colspan or rowspan attributes. The attached step definition offers a workaround for this: Wrap the entire table in a multiline string Show archive.org snapshot :

Then I should see a table with the following rows in any order:
  """
  | Date             | Name            |
  | Tue | 2011-02-08 | Bruce Wayne     |
  | Wed | 2011-02-09 | Harleen Quinzel |
  """

Wildcards

If you don't care about (part of) an existing cell, you can use a wildcard, i.e

Then I should see a table with the following rows:
  | User      | Born | 
  | Bruce *   | 1972 | 
  | * Quinzel | 1982 | 
  | *         | 1943 | 

Otherwise cells are matched exactly modulo surrounding whitespace.

Caveat

The step looks at each row individually, so if you're skipping columns

    | Name        | Id | 
    | Bruce Wayne | 35 | 

will match

    | Name        | Id  | Age | 
    | Bruce Wayne | 100 | 35  | 

Changes

2013-02-20 (Tobias)

... with exactly the following rows

2012-06-20 (Henning)

Better normalization (more consistent for expected/real input, gets rid of nbsps)

2012-06-01 (Tobias)

Better wildcard support (partial matches)

2012-05-25 (Tobias)

Better error output; "should not see" now fails if any of the rows is present; cells are now matched exactly, wildcard for values we don't care about

2011-03-18 (Henning):

Allow to negate the expectation.

2011-03-16 (Henning):

Tables can now be wrapped in multiline strings. This way we can test tables that use colspan and rowspan, where every line does not have the same number of columns.

2010-10-06 (Arne):

Also handling th now; Removing line breaks, tabs and multiple spaces inside cells to be able to check against such content

Henning Koch
October 05, 2010Software engineer at makandra GmbH
Posted by Henning Koch to makandra dev (2010-10-05 19:17)