如何解决如何使用 Sinon 在 GraphQL 解析器中模拟数据库对象?
我希望能够对我的 apollo 解析器进行单元测试。我正在构建的应用程序是一个多租户应用程序,它在运行时连接到特定的数据库,即在构建时数据库是未知的。
解析器看起来像这样
getTemplates: async (_,args,{ db }) => {
const result = await db.goalTemplate.findAll()
return result.slice(0,args.first)
},
尽管这是最简单的解析器,但它在从 apollo gateway
接收的上下文参数中获取数据库连接对象(我使用的是阿波罗联邦)。
我想模拟这个 db 对象,以便我可以使用 sinon.js
对这个解析器进行单元测试。对这些解析器进行单元测试是否是个好主意?如果是,我应该如何编写可以在其他类似但更复杂的解析器中复制的测试用例。
解决方法
使用 sinon.stub()
为 db.goalTemplate.findAll()
方法创建存根。
例如
resolver.ts
:
export const resolvers = {
getTemplates: async (_,args,{ db }) => {
const result = await db.goalTemplate.findAll();
return result.slice(0,args.first);
},};
resolver.test.ts
:
import { resolvers } from './resolver';
import sinon from 'sinon';
import { expect } from 'chai';
describe('65888128',() => {
it('should pass',async () => {
const mDb = {
goalTemplate: {
findAll: sinon.stub().resolves([1,2,3]),},};
const actual = await resolvers.getTemplates({},{ first: 2 },{ db: mDb });
expect(actual).to.be.eql([1,2]);
sinon.assert.calledOnce(mDb.goalTemplate.findAll);
});
});
单元测试结果:
65888128
✓ should pass
1 passing (5ms)
-------------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
-------------|---------|----------|---------|---------|-------------------
All files | 100 | 100 | 100 | 100 |
resolver.ts | 100 | 100 | 100 | 100 |
-------------|---------|----------|---------|---------|-------------------
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。