gpt4 book ai didi

jestjs - 如何用 Jest 测试objection.js?

转载 作者:行者123 更新时间:2023-12-04 11:40:55 25 4
gpt4 key购买 nike

Model.knex(knex);

const app = express();

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.use(i18nextMiddleware);

我想测试用户 Controller 的 getUsers 方法。它从 usersModel getUsers 方法获取数据。我通过 Objections ORM 从 MySQL 获取日期。
app.get(
'/',
checkFilter(['type']),
users.getUsers
);

根据说明,我正在更改查询方法。
class MyQueryBuilder extends QueryBuilder {
query() {
return this.resolve({ test: 11111 });
}
}

class UsersModel extends Model {
static get QueryBuilder() {
return MyQueryBuilder;
}
}

jest.spyOn(Users, 'query')
.mockImplementation(UsersModel.query);

描述测试。
describe('get errors', () => {
beforeAll(done => {
i18next.on('initialized', () => {
done()
});
});

it('with filter', done => {
request(app)
.get('/')
.query({page: 0, perPage: 5, type: 'admin'})
.end((err, res) => {
if (err) return done(err);

expect(res.status).toBe(200);
expect(
Object.keys(res.body).sort()
).toEqual([
'items',
'itemsOnPage',
'currentPage',
'totalPage',
'totalItems'
].sort());
expect(res.body.items).toHaveLength(8);
expect(res.body.totalItems).toBe(usersMockDB.getUsers.length);

console.log(res.body);

done();
});
});

afterAll(done => {
knex.destroy();

done();
})
});


方法 getUsers 的用户模型。
    const { Users } = require('../../db/models/Users');

const query = Users
.query()
.select(
'id',
'login',
'type',
'edit',
'email',
'phone',
'block'
)
.orderBy('id', 'DESC')
.page(page, perPage);

// filter

if (Object.keys(usersFilter).length) {
for (let field in usersFilter) {
if ( usersFilter.hasOwnProperty(field) ) {
query.where(field, 'like', `%${ usersFilter[field] }%`);
}
}
}

const { results, total } = await query;

return {
items: results,
itemsOnPage: Number(perPage),
currentPage: Number(page),
totalPage: Math.ceil(total/perPage),
totalItems: Number(total)
}

我应该覆盖方法页面和在哪里?据我了解,他们进行新的数据库查询。

最佳答案

这可能并非在所有情况下都是可取的,但我发现使用反对模型的单元测试的最简单解决方案是为每个测试创建一个事务。这确实意味着您需要一个数据库来运行测试,但在测试之间一切都会回滚。
jest.config.js , 添加这一行

setupFilesAfterEnv: ['./jest.setup.js'],
jest.setup.js :
import objection from 'objection';
import knex from './src/db/index.js'; // Change src/db/index.js to the path to the file where you export your knex instance

const {transaction, Model} = objection;

global.beforeAll(async () => {
global.knex = knex;
global.txn = null;
});

global.beforeEach(async () => {
global.txn = await transaction.start(knex);
Model.knex(global.txn);
});

global.afterEach(async () => {
await global.txn.rollback();
Model.knex(knex);
});

global.afterAll(async () => {
global.knex.destroy();
});
然后,您可以在代码和单元测试中按预期使用模型
import {User} from './src/db/models/index.js';

it('creates and reads users', async () => {
const user = await User.query().insert({email: 'test@test.com'});
const users = await User.query();

expect(users).toHaveLength(1);
});

it('does not persist users between tests', async () => {
const users = await User.query();

expect(users).toHaveLength(1);
});

关于jestjs - 如何用 Jest 测试objection.js?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60757241/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com