我在我的node.js项目中使用testdouble
来存根调用。这个特殊的函数包含一个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));
});
}
所以我想确定是否根据错误条件正确处理resolve
和reject
。假设我需要验证一些自定义逻辑。
我的测试
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的结果需要是一个promise,所以我使用一个值来解析,该值需要是另一个解析或拒绝的promise。
与之相关的行是database.connect()
不是承诺的结果。
TypeError: Cannot read property 'then' of undefined
任何人都可以成功使用Test Double来阻止这种类型的通话吗?
答案 0 :(得分:1)
因此找出了解决方案。在解决方案中我们遇到了一些注意事项。简而言之,决议最终成为了......
td.when(database.connect()).thenResolve({then: (resolve) => resolve('ok')});
这解析了当test double看到数据库连接时返回的thenable。然后还可以添加后续调用。
如果您将对象发送到database.connect()
,您还必须注意它正在进它要正确使用===
。
答案 1 :(得分:0)
Test double为单元测试提供存根。在你的情况下,'db'是我们需要模拟的对象。通过
创建模拟数据库 td.object(Database) // Database is the class or constructor of your db
将是正确的选择,但是在这种情况下简单地模仿你需要的那些方法,我不会那样选择。
这是经过测试的模块'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))
})
})
所以请告诉我这些是否让你感到困惑。