testing承诺使用testdoublejs多个thens

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

 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)); }); } 

所以我想确定决定和reject是否正确处理基于错误条件。 假设有一些我需要validation的自定义逻辑。

为我的testing

 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); } 

问题是,连接的结果需要是一个承诺,所以我使用然后解决的价值,这是另一个承诺,解决或拒绝的承诺。

它所关联的行是database.connect()的结果不是承诺。

 TypeError: Cannot read property 'then' of undefined 

任何人都可以成功用Test Double来扼杀这种types的调用?

所以想出了决议。 在解决scheme中我们遇到了一些需要注意的事项。 总之决议结束了这个…

 td.when(database.connect()).thenResolve({then: (resolve) => resolve('ok')}); 

这解决了当testingdouble看到数据库连接时返回的可靠性。 然后也可以添加后续的呼叫。

还有一部分要注意的是,如果你发送一个对象到database.connect()你必须知道它正在做===相等检查,你将需要有一个对该对象的引用,以便它正确使用td.when

testing双提供unit testing的存根。 而在你的情况下,'db'是我们需要模拟的对象。 通过创build模拟分贝

td.object(Database) // Database is the class or constructor of your db

将是正确的select,但只是嘲笑你在这种情况下需要的方法,我不会select这种方式。

这里是testing的模块,'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; 

而testing文件,使用摩卡和chai.expect,这也可以是任何其他的unit testing模块:

 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)) }) }) 

所以请让我知道,如果这些混淆你。