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

问题描述 投票:0回答:1

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

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

  • 节点16.15.1
  • 赛普拉斯13.5.1
  • TypeScript 5.0.2
  • ts-node 10.9.1
  • mssql 9.1.1

以下方法适用于服务器端,但在 Cypress 测试期间会抛出合适的客户端(浏览器)端:

数据库文件:

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}`);
        }
    }
}

测试文件:

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

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

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

await sql.connect(this._databaseConnectionString);

错误:

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

util.promisify 不是一个函数

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

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

我们动态生成了一个新测试来显示此失败。

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

sql node.js database promise cypress
1个回答
0
投票

您的组件需要 Node,因此无法在 Cypress 的 Javascript 环境中进行测试。


Cypress 是一个基于浏览器的前端测试框架。 mssql 明确适用于 Node.JS,预计不能在浏览器中工作。

虽然您的代码没有显式调用

util.promisify
,但 mssql 或其依赖项很可能会这样做,并且在浏览器环境中会失败,因为 util.promisify 是 Node 提供的 API,而不是浏览器中实现的 Javascript 标准的一部分。

在其他一些情况下,您可以使用“polyfill”或“shim”为非 Node 环境(如 Cypress 浏览器)提供实现,但我不建议在这里这样做:可能有很多

mssql
的其他特定于 Node 的部分使其不太适合基于浏览器的测试。相反,您必须接受这样一个事实:您编写的消耗
mssql
的组件无法在 Cypress 浏览器环境中测试其 Javascript。

这意味着您需要一个基于 Node 的测试框架来在单元测试或系统测试级别测试使用 mssql 的组件; LogRocket 有一个

Node 测试框架列表,但互联网上还存在许多其他框架,我无意为该特定框架提供个人认可。您仍然可以使用 Cypress 编写端到端测试,但您可以通过让 Cypress 访问您的 Node.JS 服务器来实现这一点,以便 Cypress 验证端到端体验,并且 mssql 消耗保持在 Node.JS 内服务器。

© www.soinside.com 2019 - 2024. All rights reserved.