我是一名 JavaScript 和 Python 开发人员。这是一个使用jestjs测试框架的单元测试代码片段:
index.ts:
import dotenv from 'dotenv';
export class OsEnvFetcher {
constructor() {
const output = dotenv.config();
if (output.error) {
console.log('Error loading .env file');
process.exit(1);
}
}
}
index.test.ts:
import { OsEnvFetcher } from './';
import dotenv from 'dotenv';
describe('OsEnvFetcher', () => {
afterEach(() => {
jest.restoreAllMocks();
});
it('should pass', () => {
const mOutput = { error: new Error('parsed failure') };
jest.spyOn(dotenv, 'config').mockReturnValueOnce(mOutput);
const errorLogSpy = jest.spyOn(console, 'log');
const exitStub = jest.spyOn(process, 'exit').mockImplementation();
new OsEnvFetcher();
expect(dotenv.config).toBeCalledTimes(1);
expect(errorLogSpy).toBeCalledWith('Error loading .env file');
expect(exitStub).toBeCalledWith(1);
});
});
单元测试的结果:
PASS stackoverflow/todo/index.test.ts (11.08s)
OsEnvFetcher
✓ should pass (32ms)
console.log
Error loading .env file
at CustomConsole.<anonymous> (node_modules/jest-environment-enzyme/node_modules/jest-mock/build/index.js:866:25)
----------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
----------|---------|----------|---------|---------|-------------------
All files | 100 | 50 | 100 | 100 |
index.ts | 100 | 50 | 100 | 100 | 6
----------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 12.467s
示例中的测试方法在使用Arrange、Act、Assert模式的 js 项目中非常常见。由于该dotenv.config()方法会做一些文件系统 I/O 操作,所以它有一个副作用。所以我们将为它制作一个存根或模拟。这样,我们的单元测试就没有副作用,并且在隔离的环境中进行测试。
这同样适用于 python。我们可以使用unittest.mock模拟对象库来做同样的事情。我对这些单元测试方法非常满意。
三国纷争
相关分类