我有以下功能:
function test(room_number, user_id) {
return r.table('wins').filter({"room_number": room_number, "user_id" : user_id}).count().run(connection, function(err, cursor){
// I get the right result
console.log(cursor);
});
}
如何将此光标返回测试功能,以便我可以调用
test(2000,1),我得到了结果?
我只得到这个结果:
{ _bitField: 1,
_fulfillmentHandler0: [Function: successAdapter],
_rejectionHandler0: [Function: errorAdapter],
_progressHandler0: undefined,
_promise0: [Function],
_receiver0: [Circular],
_settledValue: undefined }
我希望有人可以帮助我:)。
答案 0 :(得分:0)
这个函数是异步的(因为它是JavaScript),没有办法让它同步。因此,test(2000, 1)
不可能返回光标。
您需要做的是传递回调,然后根据回调提供的值测试结果。请记住,在Node.js中,按照惯例,我们将错误和结果传递给回调函数。
因此,您需要像这样编写测试:
function test(room_number, user_id, callback) {
return r.table('wins').filter({"room_number": room_number, "user_id" : user_id}).count().run(connection, callback);
}
如果您希望将结果作为数组,则必须执行以下操作:
function test(room_number, user_id, callback) {
return r.table('wins').filter({"room_number": room_number, "user_id" : user_id}).count().run(connection, function(err, cursor) {
if (err) callback(err, null);
cursor.toArray(callback);
};
}
现在,当你运行测试时,你必须传递一个回调函数,它会将你期望的结果与实际结果进行比较。
test(2000, 1, function (err, cursor) { // If you use the first cursor
// Convert cursor to array
cursor.toArray(function (err, result) {
// Compare `result` with expectations
// Make sure that `result` is equal to [1, 2, 3];
assert.deepEqual(result, [1, 2, 3]);
});
})
为了清楚起见,这是一个JavaScript问题,与RethinkDB的工作原理无关。由于RethinkDB正在执行网络调用,因此该操作必须是异步的。
使用Mocha
如果您使用Mocha作为测试框架,则可以执行以下操作。
it('should equal [1, 2, 3]', function (done) {
return r.table('wins').filter({"room_number": room_number, "user_id" : user_id}).count().run(connection, function(err, cursor) {
if (err) callback(err, null);
cursor.toArray(function () {
// Compare `result` with expectations
// Make sure that `result` is equal to [1, 2, 3];
assert.deepEqual(result, [1, 2, 3]);
// Tell Mocha that you're done testing and
// want to continue to the next test
done();
});
};