简体   繁体   English

Jest 在模块中找不到函数

[英]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 .除了getRepoName之外,所有测试都通过了。 I get an error:我收到一个错误:

serverScript.getRepoName is not a function. serverScript.getRepoName 不是函数。

Inside the module, I printed the typeof for the function parameter to confirm that it is indeed a string.在模块内部,我打印了函数参数的typeof以确认它确实是一个字符串。

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

  });

  beforeEach(() => {
  });

  afterEach(() => {

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

it('getRepoName', () => {
    const repoName = serverScript.getRepoName("git@github.com: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('my@email.com'))
  });

  it('getRepoInfo', async () => {
    serverScript.getRepoInfo = jest.fn().mockReturnValue(Promise.resolve('git@github.com: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'));
  });

Here is the working example:这是工作示例:

helper.js : 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 : helper.test.js

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

  beforeEach(() => {});

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

  it('getRepoName', () => {
    const repoName = serverScript.getRepoName('git@github.com: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('my@email.com'));
  });

  it('getRepoInfo', async () => {
    serverScript.getRepoInfo = jest.fn().mockReturnValue(Promise.resolve('git@github.com: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源代码: https : //github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/59311260

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM