在运行我的单元测试时,有时一切都还可以,有时一些随机测试因一些我无法看到的原因而失败。
失败报告如下:
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来消除递归时,我仍然得到不一致的结果。
答案 0 :(得分:0)
我的对象包含一个新的Date()对象。
因为秒的差异小于0.5秒,所以它没有显示出差异,在许多情况下,时间的差异小于1毫秒,因此预期对象和实际对象的结果是相同的。
通过用一些随机字符串替换Date对象,测试始终如预期一样成功。