Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Jest can't find function in module

I have a file with a bunch of helper functions:

// extract repo name from url
function getRepoName(url) {
  let repoName = url.split("/");
  repoName = repoName[repoName.length - 1];
  repoName = repoName.replace(".git", "");
  repoName = repoName.replace("\n", "");
  return repoName;
}

// delete patch file
async function deletePatchFile() {
  return new Promise((resolve, reject) => {
    exec("rm myPatch.patch", error => {
      if (error !== null) {
        console.log("exec error deleting patch file: ", error);
        reject(error);
      }
      resolve("successfully removed patch file");
    });
  });
}
async function getRepoInfo() {
  return new Promise((resolve, reject) => {
    exec("git config --get remote.origin.url", (error, stdout) => {
      if (error !== null) {
        console.log(`exec error: ${error}`);
        reject(error);
      }

      const repoUrl = stdout.replace("\n", "");
      resolve(repoUrl);
    });
  });
}

async function getGitEmail() {
  return new Promise((resolve, reject) => {
    exec("git config --global user.email", (error, stdout) => {
      if (error !== null) {
        console.log(`exec error: ${error}`);
        reject(error);
      } else {
        resolve(stdout.replace("\n", ""));
      }
    });
  });
}

async function getGitUser() {
  return new Promise((resolve, reject) => {
    exec("git config --global user.name", (error, stdout) => {
      if (error !== null) {
        console.log(`exec error: ${error}`);
        reject(error);
      } else {
        resolve(stdout.replace("\n", ""));
      }
    });
  });

I have a unit test that tests each function. All the tests pass except getRepoName. I get an error:

serverScript.getRepoName is not a function.

Inside the module, I printed the typeof for the function parameter to confirm that it is indeed a string.

const serverScript = require('../../../scripts/app');
describe('Test Class', () => {
    beforeAll(() => {
    });
  afterAll(() => {

  });

  beforeEach(() => {
  });

  afterEach(() => {

  });
  console.log("before tests")

it('getRepoName', () => {
    const repoName = serverScript.getRepoName("[email protected]:me/repo");
    execpt(repoName.toBe('repo')); 
  });

  it('getGitUser', async () => {
      serverScript.getGitUser = jest.fn().mockReturnValue(Promise.resolve('me'));
  });

  it('getGitEmail', async () => {
      serverScript.getGitEmail = jest.fn().mockReturnValue(Promise.resolve('[email protected]'))
  });

  it('getRepoInfo', async () => {
    serverScript.getRepoInfo = jest.fn().mockReturnValue(Promise.resolve('[email protected]:me/repo'));
  });

  it('getBranchName', async () => {
    serverScript.getBranchName = jest.fn().mockReturnValue(Promise.resolve('test2'));
  });

  it('getGitCommits', async () => {
      serverScript.getGitCommits = jest.fn().mockReturnValue(Promise.resolve(['+ 7c7ca2c4284719c278f66eb61301daaa133a51fb', '+ 60989f60b8addddbbfe8c8ee415812b6783ae00e']))
  });

  it('getGitPatchFromLocal', async () => {
    serverScript.getGitPatchFromLocal = jest.fn().mockReturnValue(Promise.resolve(  "diff --git a/Makefile b/Makefile\
    index 411cc21..fd24145 100644\
    --- a/Makefile\
    +++ b/Makefile\
    .....
    "))
  });

  it('getGitPatchFromCommits', async () => {
    serverScript.getGitPatchFromCommits = jest.fn().mockReturnValue(Promise.resolve("diff --git a/README.rst b/README.rst\
    index 845a0ce..057c4bd 100644\
    --- a/README.rst\
    +++ b/README.rst\
   ...."))
  });

  it('deletePatchFile', async () => {
    serverScript.deletePatchFile = jest.fn().mockReturnValue(Promise.resolve('successfully removed patch file'));
  });
like image 459
maddie Avatar asked Apr 20 '26 09:04

maddie


1 Answers

Here is the working example:

helper.js:

import { exec } from 'child_process';

// extract repo name from url
function getRepoName(url) {
  let repoName = url.split('/');
  repoName = repoName[repoName.length - 1];
  repoName = repoName.replace('.git', '');
  repoName = repoName.replace('\n', '');
  return repoName;
}

// delete patch file
async function deletePatchFile() {
  return new Promise((resolve, reject) => {
    exec('rm myPatch.patch', (error) => {
      if (error !== null) {
        console.log('exec error deleting patch file: ', error);
        reject(error);
      }
      resolve('successfully removed patch file');
    });
  });
}
async function getRepoInfo() {
  return new Promise((resolve, reject) => {
    exec('git config --get remote.origin.url', (error, stdout) => {
      if (error !== null) {
        console.log(`exec error: ${error}`);
        reject(error);
      }

      const repoUrl = stdout.replace('\n', '');
      resolve(repoUrl);
    });
  });
}

async function getGitEmail() {
  return new Promise((resolve, reject) => {
    exec('git config --global user.email', (error, stdout) => {
      if (error !== null) {
        console.log(`exec error: ${error}`);
        reject(error);
      } else {
        resolve(stdout.replace('\n', ''));
      }
    });
  });
}

async function getGitUser() {
  return new Promise((resolve, reject) => {
    exec('git config --global user.name', (error, stdout) => {
      if (error !== null) {
        console.log(`exec error: ${error}`);
        reject(error);
      } else {
        resolve(stdout.replace('\n', ''));
      }
    });
  });
}

module.exports = {
  getRepoName,
  deletePatchFile,
  getRepoInfo,
  getGitEmail,
  getGitUser,
};

helper.test.js:

const serverScript = require('./helper');
describe('Test Class', () => {
  beforeAll(() => {});
  afterAll(() => {});

  beforeEach(() => {});

  afterEach(() => {});
  console.log('before tests');

  it('getRepoName', () => {
    const repoName = serverScript.getRepoName('[email protected]:me/repo');
    expect(repoName).toBe('repo');
  });

  it('getGitUser', async () => {
    serverScript.getGitUser = jest.fn().mockReturnValue(Promise.resolve('me'));
  });

  it('getGitEmail', async () => {
    serverScript.getGitEmail = jest.fn().mockReturnValue(Promise.resolve('[email protected]'));
  });

  it('getRepoInfo', async () => {
    serverScript.getRepoInfo = jest.fn().mockReturnValue(Promise.resolve('[email protected]:me/repo'));
  });

  it('getBranchName', async () => {
    serverScript.getBranchName = jest.fn().mockReturnValue(Promise.resolve('test2'));
  });

  it('getGitCommits', async () => {
    serverScript.getGitCommits = jest
      .fn()
      .mockReturnValue(
        Promise.resolve(['+ 7c7ca2c4284719c278f66eb61301daaa133a51fb', '+ 60989f60b8addddbbfe8c8ee415812b6783ae00e']),
      );
  });

  it('getGitPatchFromLocal', async () => {
    serverScript.getGitPatchFromLocal = jest
      .fn()
      .mockReturnValue(
        Promise.resolve(
          'diff --git a/Makefile b/Makefile\
    index 411cc21..fd24145 100644\
    --- a/Makefile\
    +++ b/Makefile\
    ..... \
    ',
        ),
      );
  });

  it('getGitPatchFromCommits', async () => {
    serverScript.getGitPatchFromCommits = jest
      .fn()
      .mockReturnValue(
        Promise.resolve(
          'diff --git a/README.rst b/README.rst\
    index 845a0ce..057c4bd 100644\
    --- a/README.rst\
    +++ b/README.rst\
   ....',
        ),
      );
  });

  it('deletePatchFile', async () => {
    serverScript.deletePatchFile = jest.fn().mockReturnValue(Promise.resolve('successfully removed patch file'));
  });
});

Unit test result:

 PASS  src/stackoverflow/59311260/helper.test.js (12.245s)
  Test Class
    ✓ getRepoName (3ms)
    ✓ getGitUser (1ms)
    ✓ getGitEmail (1ms)
    ✓ getRepoInfo (1ms)
    ✓ getBranchName (1ms)
    ✓ getGitCommits (1ms)
    ✓ getGitPatchFromLocal
    ✓ getGitPatchFromCommits (1ms)
    ✓ deletePatchFile (1ms)

  console.log src/stackoverflow/59311260/helper.test.js:9
    before tests

Test Suites: 1 passed, 1 total
Tests:       9 passed, 9 total
Snapshots:   0 total
Time:        13.961s

Source code: https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/59311260

like image 98
slideshowp2 Avatar answered Apr 21 '26 23:04

slideshowp2



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!