由于函数是第一类对象,并且可以在另一个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] }
答案 0 :(得分:1)
在JavaScript中通过引用比较函数。
(function(){}) === (function(){}); // false
实际上,这是因为函数是对象。目前(直到ES7)JavaScript中除了原始值类型(数字,字符串,空,未定义,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
并检查呈现的值是否相同。