web-dev-qa-db-ja.com

TypeError:読み取り専用プロパティに割り当てようとしました

ディレクティブのテストを書くときにこのエラーに直面しています(generator-angular-moduleを使用):

src/capitalize.js:

'use strict';

angular.module('jviotti.string', []).filter('capitalize', function() {

  return function(input) {
    return input.replace(/\w\S*/g, function(txt) {
      return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
    });
  };

});

test/spec/capitalize.js:

'use strict';

describe('Filter: capitalize', function () {

  // load the controller's module
  beforeEach(module('jviotti.string'));

  var capitalize;
  beforeEach(inject(function($filter) {
    capitalize = $filter('capitalize');
  }));

  it('should capitalize a string', function () {
    expect(capitalize('hello')).toBe('Hello');
  });

});

しかし、PhantomJSでKarmaを実行すると、次のようになります。

PhantomJS 1.9.2 (Mac OS X) Filter: capitalize should capitalize a string FAILED
    TypeError: Attempted to assign to readonly property.
        at workFn (/Users/jviotti/Projects/angular-string/bower_components/angular-mocks/angular-mocks.js:2107)
    TypeError: 'undefined' is not a function (evaluating 'capitalize('hello')')
        at /Users/jviotti/Projects/angular-string/test/spec/capitalize.js:14
PhantomJS 1.9.2 (Mac OS X): Executed 2 of 2 (1 FAILED) (0.1 secs / 0.017 secs)

何が欠けていますか?

14
jviotti

Karma.conf.jsの変更

  logLevel: config.LOG_INFO,

  logLevel: config.LOG_DEBUG,

そしてPhantomJSをFirefoxにすると、より詳細なエラーメッセージが表示されます

32

これの代わりに(Angular 1.2.2)は、angular-mocks.jsファイルの2107行目をコメントアウトしています。

if(e.stack && errorForStack) e.stack +=  '\n' + errorForStack.stack;

どうやらPhantomJSでは、エラースタックは読み取り専用です。

編集:

このエラーは、Angular 1.2.10+( github.com/angular/angular.js/pull/5047 )で発生しなくなりました(ありがとう、sherlocken!)

8
Akrikos

少なくとも1.2.10にアップグレードすると、PhantomJSと他の特定のブラウザーに関する問題がマージされるので役立ちます。 https://github.com/angular/angular.js/pull/5047 および https://を参照してくださいgithub.com/angular/angular.js/tree/v1.2.10

2
ossek

この問題はv1.2.5でも見られます。 angular-mocks.jsの回帰のようです: https://github.com/angular/angular.js/pull/5047

この差分から手動でangular-mocks.jsにパッチを適用できます: https://github.com/wizardwerdna/angular.js/commit/17515763b891ea617339610fe92079cefe0efbbe

2
Paul

以下のように、仕様の上部に参照jsファイルを追加しましたか?

/// <reference path="../../../bower_components/angular/angular.js" />
/// <reference path="../../../bower_components/angular-route/angular-route.js" />
/// <reference path="../../../bower_components/angular-ui-router/release/angular-ui-router.js" />
/// <reference path="../../../bower_components/jasmine/lib/jasmine-core/jasmine.js" /> 
/// <reference path="../../../bower_components/jasmine/lib/jasmine-core/jasmine-html.js" />
/// <reference path="../../../bower_components/jasmine/lib/jasmine-core/boot.js" />
/// <reference path="../../../bower_components/angular-mocks/angular-mocks.js" />

注:angular-mocks.jsはangular.jsの後、テストファイルの前に置く必要があります

1
TrieuH