2017-08-01 70 views
2

我們有以下工作測試例如:爲什麼拋出異常的函數沒有通過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); 
    }); 
}); 

有一個關於爲什麼第二次測試需要。如果你運行它像

it("should throw when not passed numbers", function() { 
     multiply(2, "4").should.throw(Error); 
    }); 
要與黑客

(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() { }調用來包裝?它是否對測試異步運行,或範圍或什麼?謝謝

回答

2

柴是普通的JavaScript,而不是魔術。如果你有一個表達式a().b.c()a拋出,c()不能捕捉它。 c甚至無法運行。引擎甚至不知道什麼c,因爲a沒有返回可以查找其.b.c的值;它會拋出一個錯誤。當你使用一個函數時,你有一個對象在其上查找.should,這反過來給你一個對象查找和調用.throw

這就是爲什麼它不能做到這一點,但是從一個API點,沒有什麼不妥:.should.throw只是一個功能,而不是一個函數調用的斷言。

我也推薦使用Chai的expect,它不會將自己插入到Object.prototype中以賦予魔法外觀。

相關問題