使用testdoublejs测试多个策略的Promise

ckr*_*s01 10 node.js rethinkdb test-double testdoublejs

testdouble在node.js项目中用于存根调用.这个特殊的功能是包装一个promise并then在函数本身内有多个调用.

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));
 });
}
Run Code Online (Sandbox Code Playgroud)

所以我想确定是否根据错误条件正确处理resolvereject处理.假设我需要验证一些自定义逻辑.

为了我的考试

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);
}
Run Code Online (Sandbox Code Playgroud)

问题是connect的结果需要是一个promise,所以我使用一个值来解析,该值需要是另一个解析或拒绝的promise.

与之相关的database.connect()是不是承诺的结果.

TypeError: Cannot read property 'then' of undefined
Run Code Online (Sandbox Code Playgroud)

任何人都可以成功使用Test Double来阻止这种类型的通话吗?

ckr*_*s01 1

于是想出了解决办法。我们在解决方案中遇到了一些需要注意的事项。简而言之,决议最终是这样的......

td.when(database.connect()).thenResolve({then: (resolve) => resolve('ok')});
Run Code Online (Sandbox Code Playgroud)

这解决了当测试替身看到数据库连接时返回的thenable。然后也可以添加后续的调用。

还有一点需要注意,如果您发送一个对象,database.connect()您必须知道它正在执行===相等性检查,并且您需要拥有对该对象的引用才能正确使用td.when