为什么抛出异常的函数不通过 function_name.should.throw(error)?
Why do functions that throw exception not pass with function_name.should.throw(error)?
我们有以下工作测试示例:
"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() { }
调用中包装它的原因是什么?是异步测试 运行ning 还是范围之类的?
Chai 是常规的 JavaScript,不是魔法。如果你有一个表达式 a().b.c()
并且 a
抛出,c()
无法捕获它。 c
连 运行 都做不到。引擎甚至不知道 c
是什么 ,因为 a
没有 return 可以查看 .b.c
的值向上;它抛出了一个错误。当你使用一个函数时,你有一个对象可以在其上查找 .should
,这反过来又给你一个对象来查找和调用 .throw
.
这就是为什么它不能这样做的原因,但是从API的角度来看,没有错:.should.throw
只是一个断言函数而不是函数调用。
我还建议使用 Chai 的 expect
,它不会将自身插入 Object.prototype
以提供魔法外观。
我们有以下工作测试示例:
"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() { }
调用中包装它的原因是什么?是异步测试 运行ning 还是范围之类的?
Chai 是常规的 JavaScript,不是魔法。如果你有一个表达式 a().b.c()
并且 a
抛出,c()
无法捕获它。 c
连 运行 都做不到。引擎甚至不知道 c
是什么 ,因为 a
没有 return 可以查看 .b.c
的值向上;它抛出了一个错误。当你使用一个函数时,你有一个对象可以在其上查找 .should
,这反过来又给你一个对象来查找和调用 .throw
.
这就是为什么它不能这样做的原因,但是从API的角度来看,没有错:.should.throw
只是一个断言函数而不是函数调用。
我还建议使用 Chai 的 expect
,它不会将自身插入 Object.prototype
以提供魔法外观。