gpt4 book ai didi

javascript - 在 NodeJS 中测试 promise

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

我正在尝试了解如何在 NodeJS 中测试 promises,而我在其他语言中使用的测试方法在这里有点让我失望。基本问题是“我如何有效地测试一个或多个链接的 then(以及 done 或 catch)promise block 中的间接输入和输出?”

这里是lib/test.js的源码:

var Bluebird = require("bluebird"),
fs = Bluebird.promisifyAll(require("fs"));

function read(file) {
return fs.readFileAsync(file)
.then(JSON.parse)
.done(function () {
console.log("Read " + file);
});
}

function main() {
read("test.json");
}

if (require.main === module) {
main();
}

module.exports = read;

这里是tests/test.js

的源代码
var Bluebird = require("bluebird"),
chai = require("chai"),
expect = chai.expect,
sinon = require("sinon"),
sandbox = sinon.sandbox.create(),
proxyquire = require("proxyquire");

chai.use(require("chai-as-promised"));
chai.use(require("sinon-chai"));

describe("test", function () {
var stub, test;

beforeEach(function () {
stub = {
fs: {
readFile: sandbox.stub()
}
}
test = proxyquire("../lib/test", stub);
});

afterEach(function () {
sandbox.verifyAndRestore();
});

it("reads the file", function () {
test("test.json");
expect(stub.fs.readFile).to.have.been.calledWith("test.json");
});
it("parses the file as JSON", function () {
stub.fs.readFileAsync = sandbox.stub().returns(Bluebird.resolve("foo"));
sandbox.stub(JSON, "parse");
test("test.json");
expect(JSON.parse).to.have.been.calledWith("foo");
});
it("logs which file was read", function () {
stub.fs.readFileAsync = sandbox.stub();
sandbox.stub(JSON, "parse");
test("bar");
expect(console.log).to.have.been.calledWith("Read bar")
});
});

我意识到这些示例微不足道且做作,但我希望尝试了解如何测试 promise 链,而不是如何读取文件并将其解析为 JSON。 :)

此外,我不依赖于任何框架或类似的东西,所以如果我在获取任何包含的 NodeJS 库时无意中选择了错误,也将不胜感激。

谢谢!

最佳答案

假设语法是 Mocha,您需要返回 promise。毕竟当您从方法中返回它们时,所有 promise 都是通过返回值工作的,所以如果您不从测试中返回它们,测试库就无法 Hook 它们。

describe("testing promises with mocha", () => {
it("works by returning promises", () => {
return Promise.resolve("This test passes");
});
it("fails by returning promises", () => {
return Promise.reject(Error("This test fails"));
});
it("Lets you chain promises", () => {
return fs.readFileAsync("test.json").then(JSON.parse);
});
});

(新的函数箭头语法适用于 NodeJS,如果您需要支持旧 Node - 将其转换为 function(){ 调用)

关于javascript - 在 NodeJS 中测试 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32976960/

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