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'),我甚至不认为这是可能的。