Javascript 单元测试数据库查询

Javascript 单元测试数据库查询,javascript,node.js,unit-testing,jestjs,sinon,Javascript,Node.js,Unit Testing,Jestjs,Sinon,问题:因此,作为单元测试的初学者,我最近遇到了一个问题,那就是处理大量使用数据库的类 使用的技术:打字脚本、SinonJS、节点Postgres和Jest 示例:用于给定函数 public async insertUserDetails(){ const confirmationCode=this.generateConfirmationCode(); 试一试{ 等待this.db.query({ 文本:“插入用户(名字、姓氏、电子邮件、密码、注册日期、确认码)值($1、$2、$3、$4、$5

问题:因此,作为单元测试的初学者,我最近遇到了一个问题,那就是处理大量使用数据库的类

使用的技术:打字脚本、SinonJS、节点Postgres和Jest

示例:用于给定函数

public async insertUserDetails(){
const confirmationCode=this.generateConfirmationCode();
试一试{
等待this.db.query({
文本:“插入用户(名字、姓氏、电子邮件、密码、注册日期、确认码)值($1、$2、$3、$4、$5、$6)返回*”,
值:[this.firstname、this.lastname、this.email、this.password、this.registrationDate、confirmationCode]
});
}捕获(错误){
投掷误差;
}
}
合适的单元测试是确保db.query() 函数是使用正确的sql调用的,例如:

如果您专注于创建db.query,那么您尝试做的不是单元测试。然后它就变成了一个集成测试。这里您要测试的单元是
insertUserDetails
。所以你要关注这个函数的行为。你可以测试的是:1。使用正确的参数调用db.query(希望可以模拟this.db)2。若db.query抛出异常,则执行catch块并抛出异常

类似地,您应该尝试为
this.db
类编写单元测试,覆盖
query
函数

因此,一旦你确定两个单元都被正确覆盖,那么这将是一个良好的开端

现在,如果您可以选择一次性编写集成测试,您可以使用某种内存中的数据库,或者您可以随意使用一个真实的数据库,那么继续这样做,您不能完全编写单元测试


希望这能有所帮助。

是的,我的db连接被注入到我使用的类中,所以模拟不会有问题,但是如果我不能确保从输入生成正确的sql,我的测试实际上会测试什么?它总是会成功的,因为我在传递硬编码的“正确”数据。或者我仍然缺少一些基本的东西吗?如果有一种方法可以在另一个函数中提取查询创建部分,那么就进行重构并为此编写单元测试。怎么样?这确实有效!非常感谢。我为失败测试提供了坏数据,为通过测试提供了好数据,然后在我的集成测试套件中,使用数据库测试系统。谢谢。
catch(error){throw error;}
没有意义。只需放下
try
/
catch
包装器。