Skip to content

Latest commit

 

History

History
158 lines (124 loc) · 3.58 KB

mocking.md

File metadata and controls

158 lines (124 loc) · 3.58 KB
title layout nav_order
Mocking
default
5

Mocking

This Bats helper library provides command mocking functionality for BATS.

It allows to mock commands and check how they were called.

This is a very powerful feature that allows to test complex scenarios as unit tests.

{: .note } To run multiple mock assertions, check out the step runner helper.

Acknowledgments

This functionality is based on the bats-mock project. A special thank you to the contributors for their original work.

Usage

setup() {
  setup_mock
}

# Example to test the notify.sh script that uses curl to send a notification to external system.
@test "Notify" {
  app_id="9876543210"

  # Mock curl command.
  mock_curl=$(mock_command "curl")

  # Setup mock responses for curl call with specific arguments in notify.sh.
  mock_set_output "${mock_curl}" "12345678910-1234567890-${app_id}-12345" 1
  mock_set_output "${mock_curl}" "201" 2

  run ./notify.sh
  assert_success

  # Single line mock assertion example.
  assert_equal "-s -X GET https://api.example.com/v2/applications.json" "$(mock_get_call_args "${mock_curl}" 1)"
  # Multi-line mock assertion example.
  assert_equal '-X POST https://api.example.com/v2/applications/9876543210/deployments.json -d {
  "deployment": {
    "description": "example description",
  }
}' "$(mock_get_call_args "${mock_curl}" 2)"
}

Setup functions

setup_mock

Setup mock support. Call this function from your test's setup() method.

mock_command

  • Description: Mock provided command.
  • Arguments:
    • Mocked command name
  • Outputs: Path to created mock file.
  • Usage:
    mock_command "ls"

mock_set_output

  • Description: Sets the output of the mock.
  • Arguments:
    • Path to the mock
    • Output or - for STDIN
    • Index of the call (optional)
  • Usage:
    mock_set_output ${mock} "some output"

mock_set_status

  • Description: Sets the exit status of the mock.
  • Arguments:
    • Path to the mock
    • Status
    • Index of the call (optional)
  • Usage:
    mock_set_status ${mock} 0

mock_set_side_effect

  • Description: Sets the side effect of the mock.
  • Arguments:
    • Path to the mock
    • Side effect or - for STDIN
    • Index of the call (optional)
  • Usage:
    mock_set_side_effect ${mock} "some_command"

Assertion functions

mock_get_call_args

  • Description: Returns the arguments line the mock was called with.
  • Arguments:
    • Path to the mock
    • Index of the call (optional)
  • Outputs: Arguments line
  • Usage:
    assert_equal "expected_arg1 expected_arg2" "$(mock_get_call_args "${mock}" 1)"

mock_get_call_num

  • Description: Returns the number of times the mock was called.
  • Arguments:
    • Path to the mock
  • Outputs: Number of calls
  • Usage:
    assert_equal "1" "$(mock_get_call_num "${mock}" 1)"

mock_get_call_user

  • Description: Returns the user the mock was called with.
  • Arguments:
    • Path to the mock
    • Index of the call (optional)
  • Outputs: User name
  • Usage:
    assert_equal "expected_user" "$(mock_get_call_user "${mock}" VAR_NAME 1)"

mock_get_call_env

  • Description: Returns the value of the environment variable the mock was called with.
  • Arguments:
    • Path to the mock
    • Variable name
    • Index of the call (optional)
  • Outputs: Variable value
  • Usage:
    assert_equal "expected_val1" "$(mock_get_call_env "${mock}" VAR_NAME 1)"