Mocha/Chai to.not.throw(TypeError) 奇怪的行为
Mocha/Chai to.not.throw(TypeError) strange behavior
我尝试使用 Mocha 和 Chai 在 NodeJs 上进行单元测试...
我的第一个测试套件是根据参数类型验证构造函数是否 return 或 return TypeError。
/* ./test/entity/Point.js */
"use strict";
var expect = require("chai").expect;
var Point = require("./../entity/Point");
describe("Point entity", function() {
it("x parameter must not be string", function() {
var fn = function() { var p = new Point("5", 40); };
expect(fn).to.throw(TypeError);
});
it("y parameter must not be string", function() {
var fn = function() { var p = new Point(5, "40"); };
expect(fn).to.throw(TypeError);
});
it("x and y parameters must be number", function() {
var fn = function() { var p = new Point(5, 40); };
expect(fn).to.not.throw(TypeError);
});
});
我测试的构造函数:
/*./entity/Point.js */
"use strict";
function Point(x, y) {
// Type validation
if(x && !(typeof x === "number")) {
throw new TypeError("x is expected to be a number");
}
if(y && !(typeof y === "number")) {
throw new TypeError("y is expected to be a number");
}
// instantiation
this.x = x;
this.y = y;
}
module.exports = Point;
第一次测试没问题。
二测正常。
但是第三次测试给我一个奇怪的断言错误:
Point entity
V x parameter must not be string
V y parameter must not be string
1) x and y parameters must be number
2 passing (67ms)
1 failing
1) Point entity x and y parameters must be number:
AssertionError: expected [Function] to not throw 'TypeError' but 'TypeError: Point is not a function' was thrown
at Context. (C:\Users\Cedric\Documents\NodeProjects\SqueezeParking\test\entity\Point.js:19:32)
at callFn (C:\Users\Cedric\AppData\Roaming\npm\node_modules\mocha\lib\runnable.js:326:21)
at Test.Runnable.run (C:\Users\Cedric\AppData\Roaming\npm\node_modules\mocha\lib\runnable.js:319:7)
at Runner.runTest (C:\Users\Cedric\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:422:10)
at C:\Users\Cedric\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:528:12
at next (C:\Users\Cedric\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:342:14)
at C:\Users\Cedric\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:352:7
at next (C:\Users\Cedric\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:284:14)
at Immediate._onImmediate (C:\Users\Cedric\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:320:5)
如果我使用 NodeJs 断言模块而不是 Chai,我也会收到断言错误:
Point entity
V x parameter must not be string
V y parameter must not be string
1) x and y parameters must be number
2 passing (55ms)
1 failing
1) Point entity x and y parameters must be number:
AssertionError: Got unwanted exception (TypeError)..
at _throws (assert.js:341:5)
at Function.assert.doesNotThrow (assert.js:359:3)
at Context. (C:\Users\Cedric\Documents\NodeProjects\SqueezeParking\test\entity\Point.js:19:16)
at callFn (C:\Users\Cedric\AppData\Roaming\npm\node_modules\mocha\lib\runnable.js:326:21)
at Test.Runnable.run (C:\Users\Cedric\AppData\Roaming\npm\node_modules\mocha\lib\runnable.js:319:7)
at Runner.runTest (C:\Users\Cedric\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:422:10)
at C:\Users\Cedric\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:528:12
at next (C:\Users\Cedric\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:342:14)
at C:\Users\Cedric\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:352:7
at next (C:\Users\Cedric\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:284:14)
at Immediate._onImmediate (C:\Users\Cedric\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:320:5)
如果我在 Mocha 之外使用 Chai 或 NodeJs 断言模块,第三个测试不会抛出 TypeError :
/*./server.js */
var expect = require("chai").expect;
var Point = require("./entity/Point");
var fn = function() {
var p = new Point(10, 20);
}
expect(fn).to.not.throw(TypeError);
似乎这个奇怪的 TypeError 来自 Mocha,但我不明白为什么以及如何......
有人有想法吗?
您的测试代码正在将自身作为模块导入。为了说明,将 ./test/entity/Point.js
开头的代码更改为:
exports.foo = "foo";
var expect = require("chai").expect;
var Point = require("./../entity/Point");
console.log(Point);
你会得到输出:
{ foo: 'foo' }
[... followed by the tests passing and failing ...]
将您用来要求要测试的代码的路径更改为 var Point = require("../../entity/Point");
,您的测试将通过。
我尝试使用 Mocha 和 Chai 在 NodeJs 上进行单元测试...
我的第一个测试套件是根据参数类型验证构造函数是否 return 或 return TypeError。
/* ./test/entity/Point.js */
"use strict";
var expect = require("chai").expect;
var Point = require("./../entity/Point");
describe("Point entity", function() {
it("x parameter must not be string", function() {
var fn = function() { var p = new Point("5", 40); };
expect(fn).to.throw(TypeError);
});
it("y parameter must not be string", function() {
var fn = function() { var p = new Point(5, "40"); };
expect(fn).to.throw(TypeError);
});
it("x and y parameters must be number", function() {
var fn = function() { var p = new Point(5, 40); };
expect(fn).to.not.throw(TypeError);
});
});
我测试的构造函数:
/*./entity/Point.js */
"use strict";
function Point(x, y) {
// Type validation
if(x && !(typeof x === "number")) {
throw new TypeError("x is expected to be a number");
}
if(y && !(typeof y === "number")) {
throw new TypeError("y is expected to be a number");
}
// instantiation
this.x = x;
this.y = y;
}
module.exports = Point;
第一次测试没问题。 二测正常。 但是第三次测试给我一个奇怪的断言错误:
Point entity V x parameter must not be string V y parameter must not be string 1) x and y parameters must be number 2 passing (67ms) 1 failing 1) Point entity x and y parameters must be number: AssertionError: expected [Function] to not throw 'TypeError' but 'TypeError: Point is not a function' was thrown at Context. (C:\Users\Cedric\Documents\NodeProjects\SqueezeParking\test\entity\Point.js:19:32) at callFn (C:\Users\Cedric\AppData\Roaming\npm\node_modules\mocha\lib\runnable.js:326:21) at Test.Runnable.run (C:\Users\Cedric\AppData\Roaming\npm\node_modules\mocha\lib\runnable.js:319:7) at Runner.runTest (C:\Users\Cedric\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:422:10) at C:\Users\Cedric\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:528:12 at next (C:\Users\Cedric\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:342:14) at C:\Users\Cedric\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:352:7 at next (C:\Users\Cedric\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:284:14) at Immediate._onImmediate (C:\Users\Cedric\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:320:5)
如果我使用 NodeJs 断言模块而不是 Chai,我也会收到断言错误:
Point entity V x parameter must not be string V y parameter must not be string 1) x and y parameters must be number 2 passing (55ms) 1 failing 1) Point entity x and y parameters must be number: AssertionError: Got unwanted exception (TypeError).. at _throws (assert.js:341:5) at Function.assert.doesNotThrow (assert.js:359:3) at Context. (C:\Users\Cedric\Documents\NodeProjects\SqueezeParking\test\entity\Point.js:19:16) at callFn (C:\Users\Cedric\AppData\Roaming\npm\node_modules\mocha\lib\runnable.js:326:21) at Test.Runnable.run (C:\Users\Cedric\AppData\Roaming\npm\node_modules\mocha\lib\runnable.js:319:7) at Runner.runTest (C:\Users\Cedric\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:422:10) at C:\Users\Cedric\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:528:12 at next (C:\Users\Cedric\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:342:14) at C:\Users\Cedric\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:352:7 at next (C:\Users\Cedric\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:284:14) at Immediate._onImmediate (C:\Users\Cedric\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:320:5)
如果我在 Mocha 之外使用 Chai 或 NodeJs 断言模块,第三个测试不会抛出 TypeError :
/*./server.js */
var expect = require("chai").expect;
var Point = require("./entity/Point");
var fn = function() {
var p = new Point(10, 20);
}
expect(fn).to.not.throw(TypeError);
似乎这个奇怪的 TypeError 来自 Mocha,但我不明白为什么以及如何...... 有人有想法吗?
您的测试代码正在将自身作为模块导入。为了说明,将 ./test/entity/Point.js
开头的代码更改为:
exports.foo = "foo";
var expect = require("chai").expect;
var Point = require("./../entity/Point");
console.log(Point);
你会得到输出:
{ foo: 'foo' }
[... followed by the tests passing and failing ...]
将您用来要求要测试的代码的路径更改为 var Point = require("../../entity/Point");
,您的测试将通过。