Node.js 使用testdoublejs使用多个THEN测试承诺

Node.js 使用testdoublejs使用多个THEN测试承诺,node.js,rethinkdb,test-double,testdoublejs,Node.js,Rethinkdb,Test Double,Testdoublejs,我正在node.js项目中使用testdouble进行存根调用。此特定函数正在包装一个承诺,并且在函数本身中有多个调用 function getUser (rethink, username) { return new Promise((resolve, reject) => { let r = database.connect(); r.then(conn => database.table(tablename).filter({username})) .then

我正在node.js项目中使用
testdouble
进行存根调用。此特定函数正在包装一个承诺,并且在函数本身中有多个
调用

function getUser (rethink, username) {
  return new Promise((resolve, reject) => {
  let r = database.connect();
  r.then(conn => database.table(tablename).filter({username}))
   .then(data => resolve(data))
   .error(err => reject(err));
 });
}
因此,我想根据错误条件确定是否正确处理了
解析
拒绝
。假设其中有一些我需要验证的自定义逻辑

为了我的测试

import getUser from './user';
import td from 'testdouble';
test(t => {
  const db = td.object();
  const connect = td.function();
  td.when(connect('options')).thenResolve();
  const result = getUser(db, 'testuser');
  t.verify(result);
}
问题是connect的结果必须是一个承诺,所以我使用then resolve和一个值,该值必须是另一个承诺,该承诺可以被解析或拒绝

它所涉及的行是数据库的结果。connect()
不是承诺

TypeError: Cannot read property 'then' of undefined

有人成功地使用Test Double对这种类型的调用进行存根吗?

Test Double为单元测试提供存根。在你的例子中,“db”是我们需要模拟的对象。通过创建模拟数据库

td.object(Database)//数据库是数据库的类或构造函数

这将是一个正确的选择,但要简单地模仿这种情况下需要的方法,我不会选择这种方式

这是经过测试的模块“some.js”:

function getUser (database, username) {
  return new Promise((resolve, reject) => {
    let r = database.connect();
    r.then(conn => database.table('table').filter({username:username}))
      .then(data => resolve(data))
      .catch(err => reject(err));
  });
}

module.exports = getUser;
以及使用mocha和chai.expect的测试文件,该文件也可以是此处的任何其他单元测试模块:

let td = require('testdouble');
let expect = require('chai').expect;

const getUser = require('./some');

describe('some.js',()=>{
  it('getUser',()=>{
    const db = {};
    const name = 'name';
    db.connect = td.function();
    db.table = td.function('table');
    db.filter = td.function('filter');
    td.when(db.connect()).thenResolve(db);
    td.when(db.table('table')).thenReturn(db);
    td.when(db.filter({username: name})).thenResolve('some user data');
    return getUser(db, name)
      .then(user=>{
        expect(user).to.equal('some user data')
      })
      .catch(e=>assert(e))
  })
})

因此,如果您对这些问题感到困惑,请告诉我。

因此,我找到了解决方案。我们在解决方案中遇到了一些需要注意的问题。简言之,决议最终是这样的

td.when(database.connect()).thenResolve({then: (resolve) => resolve('ok')});
这将解析test double看到数据库连接时返回的TheName表。然后还可以添加后续调用


如果将对象发送到
数据库.connect()中,还需要注意一个部分
你必须意识到它正在进行
==
相等性检查,你需要有一个对该对象的引用,它才能正确使用
td。当

你能提供你得到的错误吗?@ckross01介意给我们看一下错误和/或堆栈跟踪吗?我把错误添加到问题中,基本上它是在说明错误数据库.connect的结果不是承诺。什么是数据库.connect()?如果它接受回调,您可以在回调中执行您的逻辑,并在那里解析或拒绝它。database.connection的结果是一个承诺,因此我认为我需要解析另一个对象,该对象上有一个then函数。