Javascript 当其中一个值是函数时,mocha assert.deepEqual?

Javascript 当其中一个值是函数时,mocha assert.deepEqual?,javascript,testing,promise,mocha.js,Javascript,Testing,Promise,Mocha.js,既然函数是一级对象,并且可以在另一个js对象内部传递,那么如何在测试中执行断言以确保返回正确的函数 我用Q表示承诺,用mocha/chai/chai表示测试承诺。我的方法根据if/else返回不同的函数(我需要重定向或使用不同的路由) 我将返回如下内容: fulfill({next: function(res) {return res.render('single-pages/site-map');}}); 我的测试结果如下: return assert.becomes( page.h

既然函数是一级对象,并且可以在另一个js对象内部传递,那么如何在测试中执行断言以确保返回正确的函数

我用Q表示承诺,用mocha/chai/chai表示测试承诺。我的方法根据if/else返回不同的函数(我需要重定向或使用不同的路由)

我将返回如下内容:

fulfill({next: function(res) {return res.render('single-pages/site-map');}});
我的测试结果如下:

return assert.becomes(
    page.helpers.checkIfSinglePage('site-map', null), 
    {next: function(res) {return res.render('single-pages/site-map');}}
);
但它告诉我返回的值不一样

AssertionError: expected { next: [Function] } to deeply equal { next: [Function] }

函数在JavaScript中通过引用进行比较

(function(){}) === (function(){}); // false
事实上,这是因为函数是对象。目前(直到ES7),JavaScript中除了基本值类型(number、string、null、undefined、bool)之外的所有内容都是引用,并与引用相等性检查进行比较

从技术上讲,您可以将这两个函数作为两个字符串进行检查(比较代码),并且(假设没有旧版本的firefox),它将对同一个函数进行相等的比较——但这不是一个很好的指示,因为两个函数可能意味着相反的事情:

var foo = (function(){
x = alert;
return function foo(){ x(); } // first function
})();

var bar = (function(){
x = console.log.bind(console,"BAR");
return function foo(){ x(); } // first function
})();
foo.toString() === bar.toString(); // true, but an incorrect check.
因此,总结一下,在JavaScript中,如果没有对它们的引用,就无法知道两个是否做了相同的事情

相反,您可以调用
.next
并检查渲染的估价师是否相同

AssertionError: expected { next: [Function] } to deeply equal { next: [Function] }