与我见过的所有“util.promisify 不是函数”线程不同,我不明确尝试使用“util.promisify”函数。
我想做的是在赛普拉斯测试期间运行数据库查询。
以下方法适用于服务器端,但在 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);
错误:
- 在测试之外检测到未捕获的错误: TypeError:以下错误源自您的测试代码,而不是来自 Cypress。
util.promisify 不是一个函数
当赛普拉斯检测到源自您的测试代码的未捕获错误时 它会自动失败当前测试。
赛普拉斯无法将此错误与任何特定测试相关联。
我们动态生成了一个新测试来显示此失败。
请问有人可以帮忙吗?我什至不知道如何开始解决这个问题。有没有更好的方法在测试期间运行 SQL 查询?我从根本上做错了什么吗?
您的组件需要 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 有一个