如何在我的 javascript Web 应用程序的数据库层中为 class 函数编写一个开玩笑的单元测试?
How do I write a unit test in jest for a class function in the database layer of my javascript web application?
我正在使用 jest 为我的 Express 应用程序编写单元测试。我对测试和使用笑话都是新手,所以我很难为我的 class 函数编写单元测试,这些函数代表我的应用程序的数据库层。当我 运行 测试时,程序试图调用数据库,但无法调用,陷入了 catch 块。我哪里做错了?谢谢。
// summary.ts
import db from '../db/index';
import { generateError } from '../lib/generateError';
const SummaryModel = class {
static async findAll() {
const text = `SELECT * FROM public.summary`;
let result : any = {};
try {
result = await db.query(text);
} catch(e) {
if (e) {
throw generateError(500, 'could not query db');
}
}
const summaries = {
record: result.rows,
count: result.rowCount
}
return summaries;
}
}
export default SummaryModel;
// summary.test.js
const SummaryModel = require('../../../src/models/summary');
jest.mock('../../../src/models/summary');
test('should return an object with an array and number', async done => {
const summaries = await SummaryModel.default.findAll();
expect(typeof summaries.record).toBe('array');
expect(typeof summaries.count).toBe('number');
done();
});
// summary.test.js 已更新
const SummaryModel = require('../../../src/models/summary');
jest.mock('../../../src/models/summary');
test('should return an object with an array and number', async done => {
const SummaryModel = {
default: {
findAll: jest.fn()
},
}
const resp = {
record: [{},{}],
count: 2,
}
SummaryModel.default.findAll.mockResolvedValue(resp);
const summaries = await SummaryModel.default.findAll();
expect(summaries.record.length).toBe(2);
expect(summaries.count).toBe(2);
expect(typeof summaries.record).toBe('object');
expect(typeof summaries.count).toBe('number');
done();
});
我们的想法是模拟通常由您的方法 return 编辑的值。为此,您可以使用函数 mockResolvedValue
绕过对 DB 的调用,并在每次调用 findAll
时 return 您想要的测试数据。
例如你可以有这样的东西:
SummaryModel.default.findAll.mockResolvedValue({
record: [{}, {}], // return some test data here
count: 2,
}
检查 Jest documentation 如何模拟模块。
我正在使用 jest 为我的 Express 应用程序编写单元测试。我对测试和使用笑话都是新手,所以我很难为我的 class 函数编写单元测试,这些函数代表我的应用程序的数据库层。当我 运行 测试时,程序试图调用数据库,但无法调用,陷入了 catch 块。我哪里做错了?谢谢。
// summary.ts
import db from '../db/index';
import { generateError } from '../lib/generateError';
const SummaryModel = class {
static async findAll() {
const text = `SELECT * FROM public.summary`;
let result : any = {};
try {
result = await db.query(text);
} catch(e) {
if (e) {
throw generateError(500, 'could not query db');
}
}
const summaries = {
record: result.rows,
count: result.rowCount
}
return summaries;
}
}
export default SummaryModel;
// summary.test.js
const SummaryModel = require('../../../src/models/summary');
jest.mock('../../../src/models/summary');
test('should return an object with an array and number', async done => {
const summaries = await SummaryModel.default.findAll();
expect(typeof summaries.record).toBe('array');
expect(typeof summaries.count).toBe('number');
done();
});
// summary.test.js 已更新
const SummaryModel = require('../../../src/models/summary');
jest.mock('../../../src/models/summary');
test('should return an object with an array and number', async done => {
const SummaryModel = {
default: {
findAll: jest.fn()
},
}
const resp = {
record: [{},{}],
count: 2,
}
SummaryModel.default.findAll.mockResolvedValue(resp);
const summaries = await SummaryModel.default.findAll();
expect(summaries.record.length).toBe(2);
expect(summaries.count).toBe(2);
expect(typeof summaries.record).toBe('object');
expect(typeof summaries.count).toBe('number');
done();
});
我们的想法是模拟通常由您的方法 return 编辑的值。为此,您可以使用函数 mockResolvedValue
绕过对 DB 的调用,并在每次调用 findAll
时 return 您想要的测试数据。
例如你可以有这样的东西:
SummaryModel.default.findAll.mockResolvedValue({
record: [{}, {}], // return some test data here
count: 2,
}
检查 Jest documentation 如何模拟模块。