Skip to contents

Make sure you have the latest version of testthat installed.

if (!require(pak)) {
  install.packages("pak",
    repos = "http://cran.us.r-project.org"
  )
}
pak::pkg_install("r-lib/testthat", upgrade = TRUE, ask = FALSE)
library(testthat)

Inputs

It’s also possible to provide a table in a scenario or feature. Let’s assume we have a small input that illustrates an example behavior for our pivot_string_long() function:

input
#>           input 
#> "one-two-three"

We can include input in our bundle with the feature() and scenario():

bundle(
  feature(
    title = "Pivot String Long",
    as_a = "user of pivot_string_long()",
    i_want = "to specify a text column and a pattern",
    so_that = "peform computations on the unique items."
  ),
  background(
    title = "Input text data", 
    given = "a string or vector [string] with text columns", 
    and = "a specified pattern [sep]"),
  
  input = c("one-two-three")
)
Feature: Pivot String Long
  As a user of pivot_string_long()
  I want to specify a text column and a pattern
  So that peform computations on the unique items.
Background: Input text data
  Given a string or vector [string] with text columns
  And a specified pattern [sep]
one-two-three

Outputs

If we know we know what we the output table should look like, we can include it with the scenario: We can convert output to a Gherkin-style table using with_table():

with_table(output)
|unique_items |string        |
|-------------|--------------|
|one          |one-two-three |
|two          |NA            |
|three        |NA            |

with_table() creates a slightly modified knitr::kable(format = "pipe", align = "l") table we can include in a bundle() with the background and feature:

bundle(
scenario(
    title = "Split a single string with default separator",
    given = "a character [string] 'one-two-three'",
    when = "I pass the [string] to pivot_string_long()",
    then = "Then [unique_items] column should contain rows: 'one, two, three'",
    and = "[string] column should contain the original 'one-two-three'"
  ),
output = c("
      |unique_items |string        |
      |-------------|--------------|
      |one          |one-two-three |
      |two          |NA            |
      |three        |NA            |
          ")
)

This makes it easier to view them in RMarkdown or Quarto files (with echo set to FALSE and comment set to "")

Now our background, feature, scenario (and tables) are in the Gherkin-style format that can be placed in a R Markdown file and nicely rendered for stakeholders or non-technical audiences:

Feature: Pivot String Long
  As a user of pivot_string_long()
  I want to specify a text column and a pattern
  So that peform computations on the unique items.
Background: Input text data
  Given a string or vector [string] with text columns
  And a specified pattern [sep]
one-two-three
Scenario: Split a single string with default separator
  Given a character [string] 'one-two-three'
  When I pass the [string] to pivot_string_long()
  Then Then [unique_items] column should contain rows: 'one, two, three'
  And [string] column should contain the original 'one-two-three'

      |unique_items |string        |
      |-------------|--------------|
      |one          |one-two-three |
      |two          |NA            |
      |three        |NA            |

Now our test file contains a fully scoped test with everything documented:

describe(
bundle(
  feature(
    title = "Pivot String Long",
    as_a = "user of pivot_string_long()",
    i_want = "to specify a text column and a pattern",
    so_that = "peform computations on the unique items."
  ),
  background(
    title = "Input text data",
    given = "a string or vector [string] with text columns",
    and = "a specified pattern [sep]"),

  input = c("one-two-three")), code = {

it(
 bundle(
  scenario(
    title = "Split a single string with default separator",
    given = "a character [string] 'one-two-three'",
    when = "I pass the [string] to pivot_string_long()",
    then = "Then [unique_items] column should contain rows: 'one, two, three'",
    and = "[string] column should contain the original 'one-two-three'"
  ),
  output = c("
      |unique_items |string        |
      |-------------|--------------|
      |one          |one-two-three |
      |two          |NA            |
      |three        |NA            |")
   ), code = {
        
  input <- c("one-two-three")
  # create observed output
  observed <- pivot_string_long(input)
  
  # compare against output
  output <- data.frame(
    unique_items = c("one", "two", "three"),
    string = c("one-two-three", NA, NA))
  
  expect_equal(object = observed, expected = output)

})

})
#> Test passed

And…

devtools:::test_active_file()

it passes!

[ FAIL 0 | WARN 0 | SKIP 0 | PASS 1 ]