我正试图用chai和sinon为我的NodeJS应用程序编写单元测试,但在模拟我的kneX查询构建器时遇到了问题.

我在app.js文件中将kneX实例化为database,然后将其附加到应用程序的上下文中.

我要为其编写单元测试的函数由GraphQL查询调用,database作为参数从上下文传递.然后在该函数中构造查询.我在下面创建了一个简短的示例.(我使用的是js,而不是Typescript )

module.exports = async ({ database, data }) => {
  const queryObject = database.table('nice')
    .withSchema('very')
    .select(['some_col_1', 'some_col_2', 'some_col_3']);
  
  if (data) {
    queryObject.where('some_col_1', data.something);
  }
  
  const foo = await queryObject 
    .catch((err) => {
      console.log(err)
    });

  //Do something with foo...
};

我花了一整天的时间试图让它工作,但我一点运气都没有.我遇到的最接近的情况是收到一个错误,显示为queryObject is not a function.

其他示例设置了存储库,但我在需要特定查询的函数中构建查询.

任何帮助都将不胜感激.

推荐答案

我已经设法用mock-knex解决了我自己的问题 Link to mock-knex

这些都在我的单元测试中.导入了以下内容:

const knex = require('knex');
const mod = require('mock-knex');
const tracker = require('mock-knex').getTracker();

然后,我建立了模拟数据库连接

const db = knex({
  client: 'mssql',
  connection: {
    host: '127.0.0.1',
    user: 'mockKnex',
    password: 'mockKnex',
    database: 'mockKnex',
  },
});

然后实现了beforeafterbeforeEachafterEach功能.

describe('Unit tests', () => {
  before((done) => {
    mod.mock(db);
    done();
  });

  after((done) => {
    mod.unmock(db);
    done();
  });

  beforeEach((done) => {
    tracker.install();
    done();
  });

  afterEach((done) => {
    tracker.uninstall();
    done();
  });
});

最后,在我的测试用例中,我执行了以下操作

it('Test 1', (done) => {
    tracker.on('query', (query) => {
      expect(query.method)
        .to
        .equal('select');
      query.response([
        {
          something1: 'A',
          something2: 'B',
          something3: 'C',
          something4: 'D',
          something5: 'E',
        },
      ]);
    });

    someFunction(
      {
        database: db,
        data: { something: '1' },
      },
    ).catch((res) => {
      assert.equal(res.message, 'Something');
      done();
    });
  });

在此之后,我可以通过更改某个值为1..5的数组对象来处理SELECT查询,以获得我想要的响应.

Node.js相关问答推荐

Mongoose:如何在文档中推送到Caped(有限大小,滚动窗口)数组?

如何防止Socket-io实例化React/Next.js中的两个套接字(当前在服务器*和*客户端实例化)

谷歌应用程序脚本UrlFetchApp和nodejs-axios返回不同的结果;MyFitnessPal日记

车把模板引擎循环问题

为什么 mongoose 没有常规数组方法

在 azure blob 容器之间复制文件

Axios TypeError:将循环 struct 转换为 JSON

Promise 和 Azure 语音转文本

有没有办法判断 UUID 是否是使用 node.js 中的特定命名空间生成的?

Nodejs 从链接数组中获取数据并保存到 mongodb

在 .htaccess 中从非 www 切换到 www 后如何解决无法访问该站点?

为什么 FastAPI 需要 Web 服务器(即 Nginx)而不是 Express API?

无法使用 node 预签名 url 从 React 将图像文件上传到 s3

配额超出了每分钟的 Sheets API 写入请求数. node .js

使用新react 18.0.0 的 create-react-app my-app redux 错误

如何使用 mocha.js 模拟用于单元测试的依赖类?

如何使用适用于 Node.js 的 AWS 开发工具包将 Amazon S3 中的所有对象从一个前缀复制/移动到另一个前缀

MongoDB Node findone如何处理没有结果?

JavaScript 异步编程:promise 与生成器

如何在 node.js 沙箱中安全地运行用户提交的脚本?