Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.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
单元测试AngularJS和数据库服务_Angularjs_Unit Testing_Angularjs Service_Angular Mock - Fatal编程技术网

单元测试AngularJS和数据库服务

单元测试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

我试图对我的单个Angular工厂进行单元测试,但我很难正确地模拟和注入PockDB对象。我的工厂代码目前如下:

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,然后对自己说“这肯定不是一个好办法”