为什么抛出异常的函数不能通过function_name.should.throw(错误)传递?

时间:2017-08-01 00:45:45

标签: javascript unit-testing mocha chai

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

"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() { }电话中包装此内容的原因是什么?它是对异步运行的测试,范围还是其他什么做的?谢谢

1 个答案:

答案 0 :(得分:2)

Chai是常规JavaScript,而不是魔术。如果您有一个表达式a().b.c()a,则c()无法捕获它。 c甚至无法运行。引擎甚至无法知道c 是什么,因为a没有返回可以查找.b.c的值;它反而引发了错误。当您使用某个功能时,您有一个要查找的对象.should,该对象会为您提供一个可以查找并调用.throw的对象。

这就是不能这样做的原因,但从API的角度来看,没有错:.should.throw只是对函数的断言而不是函数调用。< / p>

我还建议使用Chai的expect,它不会将自身插入Object.prototype以显示魔法。