Zun*_*uno -2 sql database node.js promise cypress
与我见过的所有“util.promisify 不是函数”线程不同,我没有明确尝试使用“util.promisify”函数。
我想做的是在赛普拉斯测试期间运行数据库查询。
以下方法在服务器端工作,但在赛普拉斯测试期间抛出合适的客户端(浏览器)端:
数据库文件:
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)
错误:
- 在测试之外检测到未捕获的错误: 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)