How to unit test switch case in React using Jest?

Viewed 10447

I want to create a unit test for this calculation. I will use this sum function in my other component to calculate values coming from the API. Cats and dogs in that case will be the fetched data.

export const sum = (value, number, type) => {
    let result;
    switch (type) {
        case 'cats':
            result = round(sumBy(slice(value, 0, number), 'cats'));
            return Number.isNaN(result) ? 0 : result;
        case 'dogs':
            result = round(sumBy(slice(value, 0, number), 'dogs'));
            return Number.isNaN(result) ? 0 : result;
        default:
            return 0;
    }
};
2 Answers

this a function like yours :

  const sum = (value, number, type) => {
  let result;
  switch (type) {
    case "cats":
      return { ["cats"]: value * number };
    case "dogs":
      return { ["dogs"]: value + number };
    default:
      return 0;
  }
};
module.exports = sum;

test:

describe("sum function", () => {
  it("should return 0", () => {
    expect(sum(1, 1)).toBe(0);
  });
  it("should return cats", () => {
    expect(sum(3, 2, "cats")).toEqual({ cats: 6 });
  });
  it("should return dogs", () => {
    expect(sum(10, 5, "dogs")).toEqual({ dogs: 15 });
  });
});

The switch statement could have multiple cases, and I found a cleaner way to test different cases with different data using Jest test.each method:

util.js

export const calculate = ({ num1, num2, type }) => {
  switch (type) {
    case 'cats':
      return num1 + num2;
    case 'dogs':
      return num1 * num2;
    default:
      return 0;
  }
};

util.spec.js

describe('calculate', () => {
  test.each`
    num1 | num2 | type      | expected
    ${5} | ${5} | ${'cats'} | ${10}
    ${5} | ${5} | ${'dogs'} | ${25}
    ${5} | ${5} | ${'fish'} | ${0}
  `('returns $expected when type=$type for $num1 & $num2', ({ num1, num2, type, expected }) => {
    expect(calculate({ num1, num2, type })).toEqual(expected);
  });
});

output:

calculate
  ✓ returns 10 when type=cats for 5 & 5 (1 ms)
  ✓ returns 25 when type=dogs for 5 & 5
  ✓ returns 0 when type=fish for 5 & 5
Related