jasmine angularjs测试结果不一致

时间:2016-04-08 11:32:02

标签: javascript arrays angularjs unit-testing recursion

在运行我的单元测试时,有时一切都还可以,有时一些随机测试因一些我无法看到的原因而失败。

失败报告如下:

Expected spy exec to have been called with [ Object({}) ] but actual calls were [ Object({}) ]

我真的无法找到预期和实际通话之间的任何差异。 (使用比较工具)

该控制器与其他控制器的区别在于它包含递归。 它包含一个返回数组的数据源,并为该数组中的每个项执行异步代码,如:

var array = [{id:1}, {id:2}, {id:3}];

//first check the entire array
//then process the entire array
//then do something after the entire array is processed.
checkArray(0, array, object).then(function(){
  processArray(0, array, object).then(function() {
    doSomething(object);
  });
});

function checkArray(index, array, object) {
  return $q(function(resolve) {
    var record = array[index];
    //object is altered in doSomeStuff
    doSomeStuff(record, object).then(function(){
      if(++index !== array.length) {
        return resolve(checkArray(index, array, object));
      } else {
        return resolve(true);
      }
    });
  });
});

实际代码可能会中途停止检查或处理数组做某个调用错误的函数,在这种情况下会显示错误弹出窗口,并在单元测试中比较对象的最终状态。

然而,在同一个控制器(无论如何?)中还有一些测试失败了,它们没有使用这些递归执行的函数。

然而,这些间谍实际上是用一个在调用时略有不同的对象调用的。但是,Jasmine不会在调用时保持对象的状态,而是报告对象的最终状态。 (那很好,它没有执行,但我不在乎)

代码按照要求运行,但我也希望测试能够始终如一地运行而不会出现虚构错误。 我怎么能防止弹出这些错误?

(我没有看到其他与其他控制器完全不同的东西,因此我认为这种递归是造成我麻烦的原因) 当我通过将数组大小设置为1来消除递归时,我仍然得到不一致的结果。

1 个答案:

答案 0 :(得分:0)

我的对象包含一个新的Date()对象。

因为秒的差异小于0.5秒,所以它没有显示出差异,在许多情况下,时间的差异小于1毫秒,因此预期对象和实际对象的结果是相同的。

通过用一些随机字符串替换Date对象,测试始终如预期一样成功。