我有一个试图测试的功能:
vm.clearArray = function(){
for (var id=0; id<vm.copyArray.length;id++){
vm.styleIcon(vm.copyArray[id],'black')
}
vm.copyObjArray = [];
vm.copyArray = [];
}
我正试图测试它:
it('should have cleared copyArray on function call', function(){
var ctrl = $componentController('copy', null);
spyOn(ctrl, 'clearArray').and.callThrough();
spyOn(ctrl, 'styleIcon').and.callThrough();
ctrl.copyArray = [123];
ctrl.clearArray();
expect(ctrl.clearArray).toHaveBeenCalled();
// expect(ctrl.styleIcon).toHaveBeenCalled();
expect(ctrl.copyObjArray).toEqual([]);
expect(ctrl.copyArray).toEqual([]);
});
如果我取消注释上述内容,我会收到错误,并且我的覆盖率报告中从未涵盖过vm.styleIcon调用。通过将copyArray设置为包含数组中的值,我认为for循环将在运行测试时触发。情况似乎并非如此。
感谢。
答案 0 :(得分:1)
我相信存在某种导致错误的继承方案。我的假设是您的控制器由基本控制器扩展。
从我看到的几个代码中,我可以做出两个假设:
1) clearArray()在子控制器中被覆盖,例如。
vm.clearArray = function(){
...
vm.copyArray = [];
}
所以你试图测试错误的 clearArray()
或
2) ctrl.copyArray 因为实现继承的方式而无法写入,例如。
function ParentController() {
var vm = this;
vm.copyArray = [];
vm.copyObjArray = [];
vm.clearArray = function() {
for (var id=0; id<vm.copyArray.length;id++){
vm.styleIcon(vm.copyArray[id],'black')
}
vm.copyObjArray = [];
vm.copyArray = [];
}
vm.styleIcon = function(index, color) {
}
};
function ChildController() {
ParentController.call(this);
}
ChildController.prototype = Object.create(ParentController.prototype, {copyArray:{ value: [] } });
var ctrl = new ChildController();
使用上面的方法会产生错误,copyArray被定义为不可写的属性,所以行:
ctrl.copyArray = [123];
不会改变它的价值。
无论如何,如果没有更多的代码,很难得到导致错误的原因。
答案 1 :(得分:0)
循环的代码看起来不错,所以我认为可能根本没有设置属性@available(iOS 9.0, *)
open class PKContact : NSObject {
...
}
。如果您添加vm.copyArray
,结果是什么?
也许vm和console.log(vm.copyArray)
不是对同一个对象的引用,而是通过某个库调用彼此的函数?有没有其他方法可以从测试脚本中引用$componentController('copy', null)
,而不是使用vm
?
将函数中的数组作为参数传递时,必须触发循环。当然,除非在实际代码中将$componentController('copy', null)
作为参数传递,否则实际代码将失败,但它会显示循环是否存在问题,或者是否从测试脚本引用了vm:
vm.copyArray
答案 2 :(得分:0)
很难确定确切的原因,因为您已经从测试中直接看到了样本,而不是minimal, complete, and verifiable example。此外,您没有指定错误或expect
结果是什么,因此我们会提供非常有限的信息。
那就是说,我强烈怀疑vm
是未定义/ null或不是通过$componentController
可实例化的原型。如果是这种情况,您应该在spyOn(ctrl, 'clearArray').and.callThrough()
或ctrl.clearArray()
收到错误,从不运行循环,因此从不调用vm.styleIcon
。在这种情况下,您需要验证ctrl
实际上是原型vm
所属的实例(它实际上是一个全局变量吗?)。
如果不是这种情况且vm
原型都正确且$componentController('copy', null);
正在创建您认为的对象,则styleIcon
未定义/ null,无法调用并创造基本相同的问题。在这种情况下,请确保styleIcon
已设置,并且它是您认为的功能。
当其他所有方法都失败时,调试器就是你的朋友。
请指明错误的内容以及错误发生的位置(更详细)以获得更好的答案。