使用pouchdb设置karma单元测试

时间:2014-07-26 12:44:38

标签: angularjs unit-testing phantomjs karma-runner pouchdb

我想为使用pouchdb + angular-pouchdb的角度应用设置单元测试。 但是当我跑步时:

karma start karma.conf.js

我收到以下错误:

  

PhantomJS 1.9.7(Mac OS X)错误

     

TypeError:' undefined'不是一个函数(评估' eventEmitter [method] .bind(eventEmitter)')

     

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

角度应用程序在浏览器中运行良好,我的所有karma.conf.js文件都包含相同的依赖项,所以我不明白为什么pouchdb-nightly.js会有一个未定义的函数。 我错过了什么?

2 个答案:

答案 0 :(得分:9)

这是一个常见错误:PhantomJS尚未实现Function.prototype.bind(here's the bug),因此您需要es5-shim

或者你可以通过填充Function.prototype.bind而不是包括整个es5-shim库来实现。这是一个例子(取自here):

(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;
    };
  }
})();

答案 1 :(得分:1)

issue已在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",