Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does Mocha offer the option to parameterize tests "@Theory" style?

Both JUnit and N/XUnit enable us to parameterize tests which differ only by input values and expected results. In other words, we can statically define sets of test data (inputs + expected results) and let one single test execute and validate results for each of the input sets. We can do the same in JS using at least two utilities.

However, for Java and .Net we can generalize tests even more and instead of testing for specific values we can describe the rules for generating input data and generate test data on the fly, using theories ("@Theory" and "[Theory]" respectively).

What utility is there in JS that enables this level of abstraction in writing tests?

like image 643
krazyk4tlady Avatar asked Oct 19 '18 01:10

krazyk4tlady


1 Answers

I wanted to do something similar and just solved it by creating an array with the input/output parameters and calling that in a loop. This is just a basic example, but I might keep working on it a little more to see what I can make it do.

describe('Arrow', () => {
  const theories = [
    [undefined, "left-arrow", "<"],
    ["left", "left-arrow", "<"],
    ["right", "right-arrow", ">"]
  ];

  theories.forEach(([dir, className, arrow]) => {
    it(`should render the correct arrow given ${dir} direction`, () => {
      const wrapper = shallow(<Arrow dir={dir} onClick={jest.fn()} />);
      expect(wrapper.hasClass(className)).toEqual(true);
      expect(wrapper.text().toEqual(arrow);
    });
  });
like image 87
Lennard Schutter Avatar answered Oct 06 '22 10:10

Lennard Schutter