好吧,我有一些函数可以连接到数据库(redis)并返回一些数据,这些函数通常基于promise,但是它们是异步的并且包含流。我查看并阅读了一些有关测试的内容,然后选择了tape,sinon和proxyquire来使用,如果我嘲笑此功能,我将如何知道它的作用?
以下函数(listKeys)在完成扫描后(通过Promise)返回Redis数据库中存在的所有密钥。
let methods = {
client: client,
// Cache for listKeys
cacheKeys: [],
// Increment and return through promise all keys
// store to cacheKeys;
listKeys: blob => {
return new Promise((resolve, reject) => {
blob = blob ? blob : '*';
let stream = methods.client.scanStream({
match: blob,
count: 10,
})
stream.on('data', keys => {
for (var i = 0; i < keys.length; i++) {
if (methods.cacheKeys.indexOf(keys[i]) === -1) {
methods.cacheKeys.push(keys[i])
}
}
})
stream.on('end', () => {
resolve(methods.cacheKeys)
})
stream.on('error', reject)
})
}
}
那么如何测试这样的功能呢?
我认为有几种方法可以通过测试来实现此功能,而所有方法都围绕配置要由测试使用的测试流而进行。
我喜欢先写一些我认为很重要的测试用例,然后找出实现它们的方法。对我来说最重要的是
it('should resolve cacheKeys on end')
然后需要创建一个流以提供给您的功能
var Stream = require('stream');
var stream = new Stream();
然后,扫描流需要由您的测试控制
您可以通过创建假客户端来做到这一点
client = {
scanStream: (config) => { return stream }
}
然后可以使用您的断言配置测试
var testKeys = ['t'];
Method.listKeys().then((cacheKeys) => {
assert(cacheKeys).toEqual(testKeys);
done()
})
现在,您的诺言正在通过断言等待您的流将数据发送到流。
stream.emit('data', testKeys)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句