'Nested mock functions in Jest

I'm currently trying to test out mocking some of my jest functions. One of the issues I'm having is trying to mock out a function that is called inside of another function. Here is a high-level example of what I'm trying to do:

//Apple.js
function Apple(){
   return Orange(1, 2);
}

function Orange(arg1, arg2){
   return (arg1 + arg2);
}

I want to test the Apple function without making an actual call to Orange. What would be the code to mock out my orange function in a .spec.js file to make something like this happen? I was thinking something like the following but I doubt it:

//Apple.spec.js
import Apple from "Apple.js";
it("Should run Apple", () => {
   global.Orange = jest.fn().mockImplementation(() => {return 3});
   expect(Apple()).toEqual(3);
});

It's a really simple example but knowing this would definitely help me understand the next step in my project. I hope to hear from the community soon!



Solution 1:[1]

Here is the solution:

Apple.js:

function Apple() {
  return Orange(1, 2);
}

function Orange(arg1, arg2) {
  return arg1 + arg2;
}

exports.Apple = Apple;
exports.Orange = exports.Orange;

Apple.spec.js:

const functions = require('./Apple.js');

describe('Apple', () => {
  it('Should run Apple', () => {
    functions.Orange = jest.fn().mockImplementation(() => {
      return 3;
    });
    expect(functions.Apple()).toEqual(3);
  });
});

Unit test result with 100% coverage:

PASS  src/stackoverflow/51275648/Apple.spec.js
  Apple
    ? Should run Apple (4ms)

----------|----------|----------|----------|----------|-------------------|
File      |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files |      100 |      100 |      100 |      100 |                   |
 Apple.js |      100 |      100 |      100 |      100 |                   |
----------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        4.312s

Here is the completed demo: https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/51275648

Solution 2:[2]

Don't shutdown spark context in your run function. Define for that another function, i.e. stop. In your real execution call run and the stop functions. In your tests execute shutdown spark context after all tests.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 slideshowp2
Solution 2 YuriR