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

时间:2014-06-17 21:59:13

标签: javascript testing promise mocha

由于函数是第一类对象,并且可以在另一个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] }

1 个答案:

答案 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并检查呈现的值是否相同。