开玩笑:模拟字符串属性不存在



我有两个函数,我想用Jest测试一下。但是,我无法将测试覆盖率提高到 100%,因为我无法弄清楚如何模拟String.prototype.trimLeftundefined。我能做什么?

function trimLeft (str: string): string {
if (String.prototype.trimLeft) {
return str.trimLeft()
} else {
return str.replace(/^[suFEFFxA0]+/, '')
}
return str
// else something's wrong
}
function trimRight (str: string, type: string): string {
if (String.prototype.trimRight) {
return str.trimRight()
} else {
return str.replace(/[suFEFFxA0]+$/, '')
}
return str
}
export { trimLeft, trimRight }

首先,在这两种方法中无法访问最后一个语句return str。修复它们后。下面是单元测试解决方案:

index.ts

function trimLeft(str: string): string {
if (String.prototype.trimLeft) {
return str.trimLeft();
} else {
return str.replace(/^[suFEFFxA0]+/, '');
}
}
function trimRight(str: string): string {
if (String.prototype.trimRight) {
return str.trimRight();
} else {
return str.replace(/[suFEFFxA0]+$/, '');
}
}
export { trimLeft, trimRight };

index.spec.ts

import { trimLeft, trimRight } from './';
describe('59430114', () => {
describe('#trimLeft', () => {
it('t1', () => {
expect(trimLeft(' jestjs')).toBe('jestjs');
});
it('t2', () => {
Object.defineProperty(String.prototype, 'trimLeft', { value: undefined });
expect(trimLeft(' jestjs')).toBe('jestjs');
});
});
describe('#trimRight', () => {
it('t1', () => {
expect(trimRight('jestjs ')).toBe('jestjs');
});
it('t2', () => {
Object.defineProperty(String.prototype, 'trimRight', { value: undefined });
expect(trimRight('jestjs ')).toBe('jestjs');
});
});
});

100% 覆盖率的单元测试结果:

PASS  src/stackoverflow/59430114/index.spec.ts (8.386s)
59430114
#trimLeft
✓ t1 (4ms)
✓ t2 (1ms)
#trimRight
✓ t1 (1ms)
✓ t2 (1ms)
----------|----------|----------|----------|----------|-------------------|
File      |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files |      100 |      100 |      100 |      100 |                   |
index.ts |      100 |      100 |      100 |      100 |                   |
----------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests:       4 passed, 4 total
Snapshots:   0 total
Time:        10.085s

源代码:https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/59430114

最新更新