gpt4 book ai didi

javascript - 为什么抛出异常的函数不通过 function_name.should.throw(error)?

转载 作者:行者123 更新时间:2023-11-29 21:03:20 27 4
gpt4 key购买 nike

我们有以下工作测试示例:

"use strict";

var should = require("chai").should();

var multiply = function(x, y) {
if (typeof x !== "number" || typeof y !== "number") {
throw new Error("x or y is not a number.");
}
else return x * y;
};

describe("Multiply", function() {
it("should multiply properly when passed numbers", function() {
multiply(2, 4).should.equal(8);
});

it("should throw when not passed numbers", function() {
(function() {
multiply(2, "4");
}).should.throw(Error);
});
});

没有解释为什么第二个测试需要用 hack 运行

(function() {
multiply(2, "4");
}).should.throw(Error);

如果你像这样运行它

it("should throw when not passed numbers", function() {
multiply(2, "4").should.throw(Error);
});

测试失败

  Multiply
✓ should multiply properly when passed numbers
1) should throw when not passed numbers

但是作为常规节点脚本运行该函数确实失败了:

Error: x or y is not a number.
at multiply (/path/test/test.js:7:11)

所以我不明白为什么 should 没有发现它抛出错误的事实。

需要将其包装在匿名 function() { } 调用中的原因是什么?它对异步运行的测试或范围或其他东西有用吗?

最佳答案

Chai 是常规的 JavaScript,而不是魔法。如果您有一个表达式 a().b.c() 并且 a 抛出,c() 无法捕获它。 c 甚至无法运行。引擎甚至不知道 c 是什么,因为 a 没有返回一个 .b.c 的值可以查到;它抛出了一个错误。当你使用一个函数时,你有一个对象可以在其上查找 .should,这反过来又给你一个对象来查找和调用 .throw.

这就是为什么它不能这样做的原因,但是从 API 的 Angular 来看,没有错:.should.throw 只是对函数的断言函数调用。

我还建议使用 Chai 的 expect,它不会将自身插入到 Object.prototype 中以提供魔法外观。

关于javascript - 为什么抛出异常的函数不通过 function_name.should.throw(error)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45427300/

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