[英]How to jest.mock "git-simple" branchLocal function?
I use the simple-git
package. I have the following function:我使用
simple-git
package。我有以下 function:
import simpleGit from 'simple-git';
/**
* The function returns the ticket Id, is presents, in the branch name
* @returns ticket Id
*/
export const getTicketIdFromBranchName = async (ticketRegex: RegExp) => {
const git = simpleGit();
try {
const localBranches = await git.branchLocal();
const currentBranch = localBranches.current;
const currentBranchTicketMatches = currentBranch.match(ticketRegex);
if (currentBranchTicketMatches) {
return currentBranchTicketMatches[0];
}
return null;
} catch {
return null;
}
};
I try to create a unit-test for this function:我尝试为此 function 创建一个单元测试:
import { getTicketIdFromBranchName } from '@/utils/git-info';
const TICKET_ID_REGEX = /((?<!([A-Z]{1,10})-?)[A-Z]+-\d+)/.source;
describe('[utils/git-info]', () => {
it('getTicketIdFromBranchName | Function should proper ticket Id when there is one', async () => {
const ticketId = 'CLO-1234';
jest.mock('simple-git', () => {
const mGit = {
branchLocal: jest.fn(() => Promise.resolve({ current: `${ticketId} DUMMY TEST` })),
};
return jest.fn(() => mGit);
});
const result = await getTicketIdFromBranchName(new RegExp(TICKET_ID_REGEX));
expect(result === ticketId).toEqual(true);
});
});
But the unit-test fails.但是单元测试失败了。 I says I expected to get
true
but it got false
in the final line.我说我希望得到
true
,但在最后一行得到了false
。
I guess I use jest.mock
in the wrong way.我想我以错误的方式使用了
jest.mock
。
The official documentation has a key description of the use of jest.mock
.官方文档对
jest.mock
的使用有重点说明。
Note: In order to mock properly, Jest needs
jest.mock('moduleName')
to be in the same scope as therequire/import
statement.注意:为了正确模拟,Jest 需要
jest.mock('moduleName')
与require/import
语句位于相同的 scope 中。
You call the jest.mock('moduleName')
inside test case function scope, but import
the git-info
module in module scope. That's why mock doesn't work.您在测试用例 function scope 中调用
jest.mock('moduleName')
,但在模块 scope 中import
git-info
模块。这就是 mock 不起作用的原因。
Use require('moduleName')
or await import('moduleName')
in test case function. The order of the require/import
and jest.mock()
statements does not matter.在测试用例 function 中使用
require('moduleName')
或await import('moduleName')
。 require/import
和jest.mock()
语句的顺序无关紧要。
git-info.js
: git-info.js
:
import simpleGit from 'simple-git';
/**
* The function returns the ticket Id, is presents, in the branch name
* @returns ticket Id
*/
export const getTicketIdFromBranchName = async (ticketRegex) => {
const git = simpleGit();
try {
const localBranches = await git.branchLocal();
const currentBranch = localBranches.current;
const currentBranchTicketMatches = currentBranch.match(ticketRegex);
if (currentBranchTicketMatches) {
return currentBranchTicketMatches[0];
}
return null;
} catch {
return null;
}
};
git-info.test.js
: git-info.test.js
:
const TICKET_ID_REGEX = /((?<!([A-Z]{1,10})-?)[A-Z]+-\d+)/.source;
describe('[utils/git-info]', () => {
it('getTicketIdFromBranchName | Function should proper ticket Id when there is one', async () => {
const { getTicketIdFromBranchName } = await import('./git-info');
const ticketId = 'CLO-1234';
jest.mock(
'simple-git',
() => {
const mGit = {
branchLocal: jest.fn(() => Promise.resolve({ current: `${ticketId} DUMMY TEST` })),
};
return jest.fn(() => mGit);
},
{ virtual: true }
);
const result = await getTicketIdFromBranchName(new RegExp(TICKET_ID_REGEX));
expect(result === ticketId).toEqual(true);
});
});
Test result:测试结果:
PASS stackoverflow/71808909/git-info.test.js (7.439 s)
[utils/git-info]
✓ getTicketIdFromBranchName | Function should proper ticket Id when there is one (6892 ms)
-------------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
-------------|---------|----------|---------|---------|-------------------
All files | 84.62 | 50 | 100 | 81.82 |
git-info.js | 84.62 | 50 | 100 | 81.82 | 19-21
-------------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 8.215 s, estimated 9 s
package version: "jest": "^26.6.3"
package 版本:
"jest": "^26.6.3"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.