【问题标题】:TypeError: Cannot assign to read only property - KarmaTypeError:无法分配给只读属性 - 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") 显示什么?

标签: javascript jquery angularjs jquery-ui karma-jasmine


【解决方案1】:

window.location.assign 不可写:

> Object.getOwnPropertyDescriptor(window.location, 'assign')

{value: ƒ, writable: false, enumerable: true, configurable: false}

这意味着您无法临时覆盖它来监视它。

我能想到两种可能:

  1. 将所有对$window.location.assign 的调用封装在对您创建并因此可以监视的角度服务的自定义调用中。 (编辑:使用 angularjs $window 服务来促进可模拟性和测试。
  2. 测试调用 Location.assign 后,页面现在是否具有预期的 URL。

2 会更难,因为这可能会导致您离开测试。我推荐 1。它通常是一个简单的重构,并且使您的测试变得更加容易。

【讨论】:

  • 虽然 window 在 JavaScript 中是全局可用的,但它会导致可测试性问题,因为它是一个全局变量。在 AngularJS 中,我们总是通过 $window service 引用它,因此它可能会被覆盖、删除或模拟以进行测试。
  • 谢谢..这很有帮助!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-08
  • 1970-01-01
  • 2018-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多