Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么注射';ng';单元测试中更改承诺处理行为?_Javascript_Angularjs_Unit Testing - Fatal编程技术网

Javascript 为什么注射';ng';单元测试中更改承诺处理行为?

Javascript 为什么注射';ng';单元测试中更改承诺处理行为?,javascript,angularjs,unit-testing,Javascript,Angularjs,Unit Testing,以下服务使用$q.when包装第三方承诺: // service.js angular.module('test', []) .service('pouchdb', function($q, $window) { var db = new $window.PouchDB('test'); this.info = function() { return $q.when(db.info.apply(db, arguments)); }; }); 相应的单

以下服务使用
$q.when
包装第三方承诺:

// service.js
angular.module('test', [])
  .service('pouchdb', function($q, $window) {
    var db = new $window.PouchDB('test');
    this.info = function() {
      return $q.when(db.info.apply(db, arguments));
    };
  });
相应的单元测试:

describe('Failing Q when tests', function() {
  beforeEach(module('test'));

  var $rootScope, pouchdb;
  beforeEach(inject(function(_$rootScope_, pouchdb) {
    $rootScope = _$rootScope_;
    pouchdb = pouchdb;
  }));

  it('should resolve a promise', function(done) {
    // FIXME: never resolves
    pouchdb.info()
      .then(function(info) {
        expect(info).toBeDefined();
      })
      .finally(done);
    $rootScope.$apply();
  });
});
backdb.info
永远无法解析,Jasmine超时。但是,如果我手动注入
ng
,规范将按预期工作:

describe('Working Q when tests', function() {
  var pouchdb;
  beforeEach(function() {
    var $injector = angular.injector(['ng', 'test']);
    var pouchDB = $injector.get('pouchdb');
    pouchdb = pouchDB('db');
  });

  it('should resolve a promise', function(done) {
    pouchdb.info()
      .then(function(info) {
        expect(info).toBeDefined();
      })
      .finally(done);
  });
});
谁能解释一下原因

  • 第一个规范无法解析
  • 第二个规范(注入
    ng
  • 它不需要
    $rootScope.$apply
  • 这是否是一个好的模式使用

  • 你用的是有角度的模拟吗

    我认为您需要手动注入“ng”的唯一原因是,如果没有ng应用程序初始化您的应用程序,至少根据

    如果你使用角度模拟,它会帮你解决这个问题


    想不出任何其他原因来解释为什么会出现此问题。

    是的,angular Mock的来源是:首先,我认为您应该在factory中隔离PockDB初始化,并创建factory来初始化新的PockDB实例。因此,您可以稍后隔离PockDB info调用,并确保其正确模拟和承诺得到解决。因为您在测试中使用了PockDB('db'),我甚至不认为这是可能的。