Hone logo
Hone
Problems

Mastering Conditional Test Skipping in Jest

This challenge focuses on a fundamental aspect of unit testing: selectively skipping tests. In Jest, test.skip allows you to temporarily disable tests without removing them from your codebase, which is incredibly useful for ongoing development or when a test is failing due to external dependencies. You'll learn how to conditionally skip tests based on specific criteria.

Problem Description

Your task is to implement a Jest test suite that demonstrates the use of test.skip. Specifically, you need to create a scenario where some tests are executed, while others are skipped based on a predefined condition.

What needs to be achieved:

  • Create a set of Jest tests, some of which should pass, some might fail (but we'll focus on skipping), and at least one must be conditionally skipped.

Key requirements:

  • Utilize test.skip() to exclude specific tests from running.
  • Demonstrate how to skip a test permanently using test.skip.only() (or its inverse if applicable for skipping, but the core is test.skip).
  • Implement a scenario where a test is skipped conditionally based on an environment variable or a simple boolean flag.
  • Ensure that the tests that are not skipped are executed and their results (pass/fail) are reported accurately by Jest.

Expected behavior: When the Jest test suite is run, only the tests that are not skipped should execute. The output should clearly indicate which tests were run and which were skipped.

Important edge cases to consider:

  • What happens if you have multiple test.skip statements?
  • How does test.skip interact with describe blocks (i.e., can you skip an entire describe block)? (This is a bonus exploration for this challenge).

Examples

Let's imagine we're testing a simple calculator utility.

Example 1: Basic Skipping

// calculator.ts (for context, not to be written)
export const add = (a: number, b: number) => a + b;
export const subtract = (a: number, b: number) => a - b;
export const multiply = (a: number, b: number) => a * b;
// calculator.test.ts
import { add, subtract, multiply } from './calculator';

describe('Calculator Tests', () => {
  test('should add two numbers', () => {
    expect(add(2, 3)).toBe(5);
  });

  test.skip('should subtract two numbers', () => {
    expect(subtract(5, 2)).toBe(3);
  });

  test('should multiply two numbers', () => {
    expect(multiply(4, 5)).toBe(20);
  });
});

Output (when running jest):

...
  ● Calculator Tests › should subtract two numbers

    Test suite failed to run

    Exiting Jest as an error was encountered
...
// In a real Jest run, you'd see output indicating the skipped test.
// For this example, imagine a Jest output similar to:
//
// Test Suites: 1 passed, 1 skipped, 2 total
// Tests:       2 passed, 1 skipped, 3 total

Explanation: The should subtract two numbers test is skipped using test.skip. Only the add and multiply tests are executed and should pass.

Example 2: Conditional Skipping via Environment Variable

Let's assume we only want to run the subtract test when a specific environment variable is set, for instance, RUN_SUBTRACT_TEST=true.

// calculator.test.ts
import { add, subtract, multiply } from './calculator';

const runSubtractTest = process.env.RUN_SUBTRACT_TEST === 'true';

describe('Calculator Tests', () => {
  test('should add two numbers', () => {
    expect(add(2, 3)).toBe(5);
  });

  if (!runSubtractTest) {
    test.skip('should subtract two numbers', () => {
      expect(subtract(5, 2)).toBe(3);
    });
  } else {
    test('should subtract two numbers', () => {
      expect(subtract(5, 2)).toBe(3);
    });
  }

  test('should multiply two numbers', () => {
    expect(multiply(4, 5)).toBe(20);
  });
});

To run this example:

  1. Without the environment variable: jest Expected Output: subtract test is skipped.
  2. With the environment variable: RUN_SUBTRACT_TEST=true jest Expected Output: subtract test is executed and passes.

Explanation: The test.skip is conditionally applied. If RUN_SUBTRACT_TEST is not 'true', the test.skip block is executed, skipping the subtraction test. Otherwise, a regular test block is used.

Constraints

  • Your solution must be written in TypeScript.
  • You must use Jest as your testing framework.
  • The code should be runnable and demonstrable.
  • Focus on clear demonstration of test.skip and conditional skipping.

Notes

  • test.skip is a powerful tool for managing your test suite during development.
  • You can also skip entire describe blocks by using describe.skip(). Explore this for extra credit!
  • For conditional skipping, consider using environment variables, configuration files, or simple boolean flags within your test file.
  • The primary goal is to understand how and when to use test.skip.
Loading editor...
typescript