【发布时间】:2020-03-31 02:49:54
【问题描述】:
我正在尝试对一个名为search 的方法进行单元测试,该方法具有buildSearchParameter、isUnknownFields、readAll 等三种方法。我需要嘲笑他们,但我不知道该怎么做。谁能帮我解决这个问题?
【问题讨论】:
标签: javascript node.js typescript unit-testing jestjs
我正在尝试对一个名为search 的方法进行单元测试,该方法具有buildSearchParameter、isUnknownFields、readAll 等三种方法。我需要嘲笑他们,但我不知道该怎么做。谁能帮我解决这个问题?
【问题讨论】:
标签: javascript node.js typescript unit-testing jestjs
为了简化问题,我删除了它的静态类型。您可以使用jest.spyOn 为这三种方法制作存根。这是单元测试解决方案:
index.ts:
import ModelUtility from './ModelUtility';
enum EndpointType {
SEARCH = 'SEARCH',
}
export class SomeClass {
schemaConstants;
errorConstants = {
invalidQueryParameters: 'invalid',
};
search = async (query, endpointConstants) => {
const searchParam = ModelUtility.buildSearchParameter(query, endpointConstants, this.schemaConstants);
// check for unknown fields
const isUnknownFields = ModelUtility.isUnknownFields(EndpointType.SEARCH, searchParam, this.schemaConstants);
if (isUnknownFields) {
return this.errorConstants.invalidQueryParameters;
}
return this.readAll(query, searchParam, endpointConstants);
};
readAll(...args) {
return 'real data';
}
}
ModelUtility.ts:
export default {
buildSearchParameter(...args) {
return 'real search parameter';
},
isUnknownFields(...args) {
return true;
},
};
index.spec.ts:
import { SomeClass } from './';
import ModelUtility from './ModelUtility';
describe('SomeClass', () => {
afterEach(() => {
jest.restoreAllMocks();
});
it('should return invalid query parameters', async () => {
const buildSearchParameterSpy = jest
.spyOn(ModelUtility, 'buildSearchParameter')
.mockReturnValueOnce('mocked search parameter');
const isUnknownFieldsSpy = jest.spyOn(ModelUtility, 'isUnknownFields').mockReturnValueOnce(true);
const instance = new SomeClass();
const actual = await instance.search('mocked query', 'endpointConstants');
expect(actual).toBe('invalid');
expect(buildSearchParameterSpy).toBeCalledWith('mocked query', 'endpointConstants', undefined);
expect(isUnknownFieldsSpy).toBeCalledWith('SEARCH', 'mocked search parameter', undefined);
});
it('should return correctly', async () => {
const buildSearchParameterSpy = jest
.spyOn(ModelUtility, 'buildSearchParameter')
.mockReturnValueOnce('mocked search parameter');
const isUnknownFieldsSpy = jest.spyOn(ModelUtility, 'isUnknownFields').mockReturnValueOnce(false);
const instance = new SomeClass();
jest.spyOn(instance, 'readAll').mockReturnValueOnce('mocked data');
const actual = await instance.search('mocked query', 'endpointConstants');
expect(actual).toBe('mocked data');
expect(buildSearchParameterSpy).toBeCalledWith('mocked query', 'endpointConstants', undefined);
expect(isUnknownFieldsSpy).toBeCalledWith('SEARCH', 'mocked search parameter', undefined);
});
});
带有覆盖率报告的单元测试结果:
PASS src/stackoverflow/59207566/index.spec.ts
SomeClass
✓ should return invalid query parameters (7ms)
✓ should return correctly (1ms)
-----------------|----------|----------|----------|----------|-------------------|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
-----------------|----------|----------|----------|----------|-------------------|
All files | 72.73 | 100 | 57.14 | 73.68 | |
ModelUtility.ts | 20 | 100 | 0 | 20 | 2,3,5,6 |
index.ts | 88.24 | 100 | 80 | 92.86 | 24 |
-----------------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests: 2 passed, 2 total
Snapshots: 0 total
Time: 4.891s, estimated 11s
【讨论】: