TypeError: Попытка присвоить свойство readonly

Я сталкиваюсь с этой ошибкой при написании теста для директивы (используя generator-angular-module):

ЦСИ /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();
    });
  };

});

тест/спецификации/capitalize.js:

'use strict';

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

  // load the controller 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');
  });

});

Однако при запуске Karma с PhantomJS я получаю:

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)

Что мне не хватает?

Ответы

Ответ 1

Изменение в файле karma.conf.js

  logLevel: config.LOG_INFO,

к

  logLevel: config.LOG_DEBUG,

и PhantomJS для Firefox, тогда вы получите более подробное сообщение об ошибке

Ответ 2

Альтернатива этому (в Angular 1.2.2) комментирует строку 2107 в файле angular -mocks.js:

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

По-видимому, в PhantomJS стек ошибок доступен только для чтения.

Edit:

Эта ошибка больше не должна возникать в Angular 1.2.10+ (github.com/angular/angular.js/pull/5047) (Спасибо sherlocken!)

Ответ 5

Добавили ли вы ссылки на 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 и перед вашими тестовыми файлами