我们有以下工作测试示例:
"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() { }
电话中包装此内容的原因是什么?它是对异步运行的测试,范围还是其他什么做的?谢谢
答案 0 :(得分:2)
Chai是常规JavaScript,而不是魔术。如果您有一个表达式a().b.c()
和a
,则c()
无法捕获它。 c
甚至无法运行。引擎甚至无法知道c
是是什么,因为a
没有返回可以查找.b.c
的值;它反而引发了错误。当您使用某个功能时,您有一个要查找的对象.should
,该对象会为您提供一个可以查找并调用.throw
的对象。
这就是不能这样做的原因,但从API的角度来看,没有错:.should.throw
只是对函数的断言而不是函数调用。< / p>
我还建议使用Chai的expect
,它不会将自身插入Object.prototype
以显示魔法。