代码之家  ›  专栏  ›  技术社区  ›  Brian

单元测试AngularJS和PouchDB服务

  •  2
  • Brian  · 技术社区  · 10 年前

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

    factory('Track', [function() {
        var db = new PouchDB('tracks');
        var resource = {
            getAll: function() {
              return db.allDocs({include_docs: true});
            }
        return resource;
    }]);
    

    我曾尝试使用Angular的$provide服务注入一个模拟PouchDB实例,但没有成功:

     module(function($provide) {
        $provide.value('PouchDB', {
            allDocs: function() {
                return 'MOCKED';
            }
        });
    

    我不完全确定从这里去哪里。任何帮助都将不胜感激!

    1 回复  |  直到 10 年前
        1
  •  3
  •   David Losert    10 年前

    正如评论中所述: 必须包装全局变量 PouchDB 在一个服务内,使其可注射。这是由于Angular通过简单的函数参数进行DI。所以,只需要做一些类似的事情:

      angular.module('myModule')
         .factory('PouchDBWrapper', function(){
             return PouchDB;
         }
    

    然后您可以将其注入您的Track工厂:

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