gpt4 book ai didi

javascript - 如何在 JavaScript (ES6) 中测试基于生成器的流控制?

转载 作者:搜寻专家 更新时间:2023-10-31 23:09:21 26 4
gpt4 key购买 nike

如何让 Mocha 等待异步函数完成?

模块

var fs = require('mz/fs');
var co = require('co');

module.exports = new filecache();

function filecache () {
var self = this;
var storage = storage || {};

self.cache = co(function* (filePath, fileName) {
if (yield fs.exists(filePath)) {
storage[fileName] = yield fs.readFile(filePath);
}
});

self.has = function has (fileName) {
return storage.hasOwnProperty(fileName);
};
}

测试(摩卡咖啡)

var expect = require('chai').expect;

describe('phialcash', function () {
var filecache;
var filePath;
var fileName;

beforeEach(function () {
filecache = require('..');
filePath = './tests/file.fixture.txt';
fileName = filePath.split("/").pop();
});

describe('#exists', function () {
it('returns true if a file exists in the cache', function () {
filecache.cache(filePath, fileName);

expect(filecache.has(fileName)).to.equal(true);
});
});
});

测试失败是因为 filecache.cache(filePath, fileName); 异步执行,所以 filecache.has(fileName) 在预期运行时仍然为 false。

最佳答案

您应该在方法调用处而不是定义中使用co

self.cache = function* (filePath, fileName) {
if (yield fs.exists(filePath)) {
storage[fileName] = yield fs.readFile(filePath);
}
};

测试时,将函数标记为异步并将done 传递给协程。 co 将使用参数 done(err, response) 调用 done 回调。异步调用中抛出的任何异常或失败的 expect 都会导致测试用例失败。

describe('#exists', function () {
it('returns true if a file exists in the cache', function (done) {
co(function * () {
yield *filecache.cache(filePath, fileName); //generator delegation.
expect(filecache.has(fileName)).to.equal(true);
})(done);

});
});

这是一个使用 koa 的应用程序的摘录,它在内部使用 co 来处理控制流。 yield 的所有语句都是返回 thunks 的异步调用。

group.remove = function * (ids) {
var c3Domain = this.c3Domain;

let deletedCount = yield this.baseRemove(ids);
if(deletedCount > 0) {
let deletedGroupMappings = yield [this.connection.query(UNMAP_GROUPS, [this.c3Id, ids]), this.tag.unmapGroupTags(ids)];
let deletedQueueCount = yield this.removeQueuesFromXml(ids);
if(deletedQueueCount > 0) {
let eslCommands = ['reloadxml'].concat(ids.map(function (id) {
return ['callcenter_config queue unload', id + '@' + c3Domain];
}));
yield this.esl.multiApi(eslCommands);
}
}
return deletedCount;
};

测试用例:

it('should delete group', function (done) {
co(function *() {
let count = yield group.remove(['2000'])
assert(count === 1)
})(done)
})

关于javascript - 如何在 JavaScript (ES6) 中测试基于生成器的流控制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26836005/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com