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:试图分配给只读属性

TypeError:试图分配给只读属性。在 Expo / GraphQL Apollo 客户端上

排序对象数组时出错无法分配给对象'[object Array]'的只读属性'2'

无法分配给对象的只读属性

Vue导入导致无法分配给对象错误的只读属性'exports'

无法分配给对象的只读属性“stopImmediatePropagation”