TypeError:无法分配给只读属性 - Karma
Posted
技术标签:
【中文标题】TypeError:无法分配给只读属性 - Karma【英文标题】:TypeError: Cannot assign to read only property - Karma 【发布时间】:2019-12-06 04:19:12 【问题描述】:通过命令 grunt karma:unit 运行测试用例(spec.js)时,我遇到了错误-
TypeError:无法分配给对象“[object Location]”的只读属性“assign”
抛出错误的伪代码是:
$window.window.location.assign = _.noop;
spyOn($window.window.location, 'assign');
我尝试将下面的行放在所有内容之上来修复它,但徒劳-
$window.window.location.assign.writable = true;
有人可以分享他/她的观点来解决这个问题吗?谢谢!!
【问题讨论】:
Object.getOwnPropertyDescriptor(window.location,"assign")
显示什么?
【参考方案1】:
window.location.assign
不可写:
> Object.getOwnPropertyDescriptor(window.location, 'assign')
value: ƒ, writable: false, enumerable: true, configurable: false
这意味着您无法临时覆盖它来监视它。
我能想到两种可能:
-
将所有对
$window.location.assign
的调用封装在对您创建并因此可以监视的角度服务的自定义调用中。 (编辑:使用 angularjs $window
服务来促进可模拟性和测试。
测试调用 Location.assign 后,页面现在是否具有预期的 URL。
2 会更难,因为这可能会导致您离开测试。我推荐 1。它通常是一个简单的重构,并且使您的测试变得更加容易。
【讨论】:
虽然 window 在 javascript 中是全局可用的,但它会导致可测试性问题,因为它是一个全局变量。在 AngularJS 中,我们总是通过 $window service 引用它,因此它可能会被覆盖、删除或模拟以进行测试。 谢谢..这很有帮助!!以上是关于TypeError:无法分配给只读属性 - Karma的主要内容,如果未能解决你的问题,请参考以下文章
TypeError:试图分配给只读属性。在 Expo / GraphQL Apollo 客户端上
排序对象数组时出错无法分配给对象'[object Array]'的只读属性'2'