单元测试AngularJS和数据库服务
我试图对我的单个Angular工厂进行单元测试,但我很难正确地模拟和注入PockDB对象。我的工厂代码目前如下:单元测试AngularJS和数据库服务,angularjs,unit-testing,angularjs-service,angular-mock,Angularjs,Unit Testing,Angularjs Service,Angular Mock,我试图对我的单个Angular工厂进行单元测试,但我很难正确地模拟和注入PockDB对象。我的工厂代码目前如下: factory('Track', [function() { var db = new PouchDB('tracks'); var resource = { getAll: function() { return db.allDocs({include_docs: true}); } return reso
factory('Track', [function() {
var db = new PouchDB('tracks');
var resource = {
getAll: function() {
return db.allDocs({include_docs: true});
}
return resource;
}]);
我曾尝试使用Angular的$provide服务注入一个模拟数据库实例,但没有成功:
module(function($provide) {
$provide.value('PouchDB', {
allDocs: function() {
return 'MOCKED';
}
});
我不完全确定从这里走到哪里。任何帮助都将不胜感激 正如刚才评论中所述: 您必须将全局变量
backDB
封装在服务中,以使其可注入。这是由于通过简单的函数参数进行角度测量。所以,只要做一些类似的事情:
angular.module('myModule')
.factory('PouchDBWrapper', function(){
return PouchDB;
}
然后,您可以将其注入轨道工厂:
factory('Track', [function(PouchDBWrapper) {
var db = new PouchDBWrapper('tracks');
var resource = {
getAll: function() {
return db.allDocs({include_docs: true});
}
return resource;
}]);
在测试中,您可以通过以下方式模拟:
module(function($provide) {
$provide.factory('PouchDBWrapper', {
allDocs: function() {
return 'MOCKED';
}
});
为什么它不起作用?它抛出异常?还有:
DB
-公共服务从哪里来?因为你似乎没有在你的工厂里注入它,我猜它只是角度范围之外的一个全局变量?我无法在我的测试中让PockDB对象是可模拟的。PockDB var来自于包含的PockDB javascript库文件,该文件必须使其成为角度范围之外的全局变量。我/我是否需要将PockDB库的全局包含重构为一个角度化的服务,并将其注入我的工厂?是的,这是一条路要走。由于Angular仅通过在函数中使用参数来处理DI,因此还需要将待模拟对象作为参数传递,这意味着将其包装在服务或工厂中。我也要把这个作为一个答案来发布。听起来不错,谢谢你让我仔细考虑它=]我没有想过要把它转移到一个服务中,直到你提到成为一个全球var,然后对自己说“这肯定不是一个好办法”