jcg*_*582 5 node.js npm google-cloud-datastore jest
我试图通过模拟runQuery和createQuery函数对下面的listEntities函数进行单元测试。也许我应该放弃并使用仿真器进行集成测试。反正这是我的代码
实现方式:
const Datastore = require('@google-cloud/datastore');
const datastore = Datastore();
const runQueryDS = query => (datastore.runQuery(query));
const createQueryDS = kind => (datastore.createQuery(kind));
export const listEntities = (kind, runQuery = runQueryDS, createQuery = createQueryDS) => {
console.log('listEntities');
const query = createQuery(kind);
runQuery(query)
.then(results => (results[0]));
};
Run Code Online (Sandbox Code Playgroud)
测试:
import { listEntities } from './datastore.api';
describe('datastore api', () => {
describe('listEntities', () => {
test('should return list of items', () => {
console.log('begin test');
const kind = 'TestRun';
const createdQuery = 'createdQuery';
const expectedResult = ['returnedFromQuery'];
const returnedFromExecutedQuery = [expectedResult];
const createQuery = jest.fn().mockImplementation(() => (createdQuery));
const runQuery = jest.fn().mockImplementation(() => (returnedFromExecutedQuery));
const result = listEntities(kind, runQuery, createQuery);
expect(result).toEqual(expectedResult);
});
});
});
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误
FAIL app/datastore.api.test.js
? Test suite failed to run
Cannot find module './datastore_client_config' from 'datastore_client.js'
at Resolver.resolveModule (node_modules/jest-resolve/build/index.js:191:17)
at Object.<anonymous> (node_modules/@google-cloud/datastore/src/v1/datastore_client.js:30:18)
Run Code Online (Sandbox Code Playgroud)
谢谢!
应首先完成单元测试,然后进行集成测试。单元测试比集成测试更容易编写,并且隔离性好,不依赖外部服务,无副作用,可以在不同的环境中运行。
\n这是单元测试解决方案:
\nindex.js
:
const Datastore = require(\'@google-cloud/datastore\');\nconst datastore = Datastore();\n\nconst runQueryDS = (query) => datastore.runQuery(query);\nconst createQueryDS = (kind) => datastore.createQuery(kind);\n\nconst listEntities = (kind, runQuery = runQueryDS, createQuery = createQueryDS) => {\n console.log(\'listEntities\');\n const query = createQuery(kind);\n return runQuery(query).then((results) => results[0]);\n};\n\nmodule.exports = { listEntities };\n
Run Code Online (Sandbox Code Playgroud)\nindex.test.js
:
const { listEntities } = require(\'./\');\nconst Datastore = require(\'@google-cloud/datastore\');\n\njest.mock(\'@google-cloud/datastore\', () => {\n const mDatasotre = {\n runQuery: jest.fn(),\n createQuery: jest.fn(),\n };\n return jest.fn(() => mDatasotre);\n});\n\ndescribe(\'47128513\', () => {\n describe(\'#listEntities\', () => {\n afterAll(() => {\n jest.resetAllMocks();\n });\n it(\'should list entities\', async () => {\n const mDatastore = Datastore();\n mDatastore.createQuery.mockReturnValueOnce(\'fake query\');\n mDatastore.runQuery.mockResolvedValueOnce([{ id: 1 }]);\n const actual = await listEntities(\'kind\');\n expect(actual).toEqual({ id: 1 });\n expect(mDatastore.createQuery).toBeCalledWith(\'kind\');\n expect(mDatastore.runQuery).toBeCalledWith(\'fake query\');\n });\n });\n});\n
Run Code Online (Sandbox Code Playgroud)\n带有覆盖率报告的单元测试结果:
\n PASS src/stackoverflow/47128513/index.test.js (12.111s)\n 47128513\n #listEntities\n \xe2\x9c\x93 should list entities (12ms)\n\n console.log src/stackoverflow/47128513/index.js:355\n listEntities\n\n----------|----------|----------|----------|----------|-------------------|\nFile | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |\n----------|----------|----------|----------|----------|-------------------|\nAll files | 100 | 100 | 100 | 100 | |\n index.js | 100 | 100 | 100 | 100 | |\n----------|----------|----------|----------|----------|-------------------|\nTest Suites: 1 passed, 1 total\nTests: 1 passed, 1 total\nSnapshots: 0 total\nTime: 13.865s, estimated 15s\n
Run Code Online (Sandbox Code Playgroud)\n源代码:https ://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/47128513
\n 归档时间: |
|
查看次数: |
224 次 |
最近记录: |