2016-05-23 87 views
0

我尝试做与摩卡&柴单元的NodeJS测试...摩卡/柴to.not.throw(类型错误)奇怪的行为

我的第一个测试套件来验证,如果一个构造函数返回或不根据参数类型返回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; 

第一次测试就可以了。 第二项测试是可以的。 但第三次测试给我一个奇怪的断言错误:如果我使用柴或的NodeJS断言模块

 
    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) 

 
    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断言模块,而不是柴,我也得到一个断言错误摩卡外,第三次测试不乱扔类型错误:

/*./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); 

看来,这种奇怪的类型错误来自摩卡,但我不明白为什么,以及如何... 有人有想法吗?

回答

1

您的测试代码将自己导入为模块。为了说明,在./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");并且您的测试将通过。

+0

哈哈,nice catch = D – robertklep

+0

天啊!我为自己感到羞耻! 感谢您的帮助@Louis。 –