Настройка модульных тестов кармы с помощью pouchdb

Я хочу настроить модульные тесты для моего углового приложения, которое использует pouchdb + angular-pouchdb. Но когда я бегу:

karma start karma.conf.js

Я получаю следующую ошибку:

PhantomJS 1.9.7 (Mac OS X) ОШИБКА

TypeError: 'undefined' не является функцией (оценка 'eventEmitter [method].bind (eventEmitter)')

в .../public/bower_components/pouchdb/dist/pouchdb-nightly.js:5758

Приложение angular хорошо работает в браузере, и весь мой файл karma.conf.js включает одни и те же зависимости, поэтому я не понимаю, почему у pouchdb-nightly.js может быть неопределенная функция. Что мне не хватает?


person vilsbole    schedule 26.07.2014    source источник
comment
bind не реализован в phantomjs . Я не знаком с кармой и не могу порекомендовать решение.   -  person Artjom B.    schedule 26.07.2014
comment
.bind вызывается библиотекой pouchdb. Значит, это будет означать, что Pouchdb не поддерживает браузер PhantomJs?   -  person vilsbole    schedule 26.07.2014


Ответы (2)


Это распространенная ошибка: PhantomJS не реализовал Function.prototype.bind (вот в чем ошибка ), поэтому вам понадобится es5-shim.

Или вы можете обойтись просто шиммированием Function.prototype.bind вместо включения всей библиотеки es5-shim. Вот пример (взято из здесь):

(function () {
  'use strict';
  // minimal polyfill for phantomjs; in the future, we should do ES5_SHIM=true like pouchdb
  if (!Function.prototype.bind) {
    Function.prototype.bind = function (oThis) {
      if (typeof this !== "function") {
        // closest thing possible to the ECMAScript 5
        // internal IsCallable function
        throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");
      }

      var aArgs = Array.prototype.slice.call(arguments, 1),
          fToBind = this,
          fNOP = function () {},
          fBound = function () {
            return fToBind.apply(this instanceof fNOP && oThis
                   ? this
                   : oThis,
                   aArgs.concat(Array.prototype.slice.call(arguments)));
          };

      fNOP.prototype = this.prototype;
      fBound.prototype = new fNOP();

      return fBound;
    };
  }
})();
person nlawson    schedule 26.07.2014
comment
Куда делся шим? Как бы вы его использовали? - person Artjom B.; 26.07.2014
comment
поместите его в тег скрипта перед pouchdb - person nlawson; 26.07.2014
comment
или, я думаю, в случае с Karma вы помещаете его в список files перед pouchdb. - person nlawson; 26.07.2014
comment
так как в проектах уже есть es5-шим через беседку, в том числе его карма позволяет ему работать как часы. я принимаю это как ответ. - person vilsbole; 28.07.2014
comment
Это решило аналогичную проблему для меня с тестом jasmine/PhantomJS с использованием RequireJS и PouchDB. - person Mike Cavaliere; 17.11.2014

проблема исправлена ​​в PhantomJS 2+. Таким образом, обновление модулей узла Phantom должно сделать это.

Протестировано со следующими версиями модулей, связанных с тестированием, в package.json

"karma": "0.13.21",
"karma-jasmine": "0.3.7",
"karma-phantomjs-launcher": "1.0.0",
"phantomjs-prebuilt": "2.1.3",
person Jörg    schedule 08.03.2016