Search code examples
node.jsjsontestingfixtures

Require JSON as deep copy


I am writing tests right now for my node application. I have fixtures which I use to test my data and I ran into the Problem, that when I alter any of them in a method, then they are globally altered for all the other tests as well, which obviously has to do with referencing. Now I figured if I write my fixtures into a JSON and require that JSON in each file then they will have unique references for each file, which turns out now, they don't. My question would be: is there an easy way to handle fixtures in Node such that every file has an instance of the fixtures which won't affect the other test files.

The way I currently import my fixtures in every test file:

const {fixture1, someOtherFixture } = require('../../../../../fixtures/keywords.json');

Solution

  • require calls are cached, so once you call it, consecutive calls will return the same object.

    You can do the following:

    const {fixture1, someOtherFixture } = require('../../../../../fixtures/keywords.json');
    
    const fixtureCopy = JSON.parse(JSON.stringify(fixture1));
    const someOtherFixtureCopy = JSON.parse(JSON.stringify(someOtherFixtureCopy));
    

    or use a package:

    const deepcopy = require('deepcopy');
    const {fixture1, someOtherFixture } = require('../../../../../fixtures/keywords.json');
    
    const fixtureCopy = deepcopy(fixture1);
    const someOtherFixtureCopy = deepcopy(someOtherFixtureCopy);
    

    Or change your module to export a function that will return new copies everytime. This is the recommended approach in my opinion.

    module.exports = {
       get() {
          return deepcopy(fixture); // fixture being the Object you have 
       }
    }
    
    
    const fixture = require('./fixture');
    
    const fixture1 = fixture.get();