尝试运行数据库查询时,Cypress 测试期间出现“util.promisify 不是函数”错误

Zun*_*uno -2 sql database node.js promise cypress

与我见过的所有“util.promisify 不是函数”线程不同,我没有明确尝试使用“util.promisify”函数。

我想做的是在赛普拉斯测试期间运行数据库查询。

  • 节点16.15.1
  • 赛普拉斯 13.5.1
  • 打字稿 5.0.2
  • ts-节点 10.9.1
  • 微软SQL 9.1.1

以下方法在服务器端工作,但在赛普拉斯测试期间抛出合适的客户端(浏览器)端:

数据库文件:

import sql from 'mssql';

export default class Database {
    private _databaseConnectionString;

    constructor() {
        this._databaseConnectionString = 'censored but valid connection string';
    };

    async query(query: string) {
        try {
           await sql.connect(this._databaseConnectionString);
           const result = await sql.query(query);
           return result;
        } catch (errorMessage) {
            throw new Error(`Error querying database.\n${errorMessage}`);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

测试文件:

import Database from "../../support/test_data/utilities/database";
const database = new Database();

describe('testing', () => {
    it('test', () => {
        const aVariable = await database.query(`select * from Users`);
    });
});
Run Code Online (Sandbox Code Playgroud)

我隔离了触发此行异常的原因:

await sql.connect(this._databaseConnectionString);
Run Code Online (Sandbox Code Playgroud)

错误:

  1. 在测试之外检测到未捕获的错误: TypeError:以下错误源自您的测试代码,而不是来自赛普拉斯。

util.promisify 不是一个函数

当赛普拉斯检测到源自您的测试代码的未捕获错误时,它将自动使当前测试失败。

赛普拉斯无法将此错误与任何特定测试关联起来。

我们动态生成一个新测试来显示此故障。

请问有人可以帮忙吗?我什至不知道如何开始解决这个问题。有没有更好的方法在测试期间运行 SQL 查询?我从根本上做错了什么吗?

小智 5

@JeffBowman 关于 NodeJS 要求的说法是正确的。因此,您可以将数据库调用转移到在 NodeJs 中运行的任务。这是一个粗略的指南:

赛普拉斯.config.js

import { defineConfig } from 'cypress'
import Database from "./cypress/support/test_data/utilities/database";
const database = new Database();

export default defineConfig({
  e2e: {
    setupNodeEvents(on, config) {
      on('task', {
        dbQuery(query) {
          return database.query(query)  // promise unwrapped by Cypress
        },
      })
    },
  },
})
Run Code Online (Sandbox Code Playgroud)
it('test', () => {
  cy.task('dbQuery', 'select * from Users')
    .then(results => {
      // checking my results here...
...
Run Code Online (Sandbox Code Playgroud)