2015-09-16 62 views
1

我正在尝试为我的角度控制器(写在打字稿)编写单元测试。控制器用户数据表。我需要在测试中将DTOptionsBuilder注入控制器,但无法弄清楚如何模拟它。这是我的代码到目前为止。Angular/Typescript单元测试与数据表

module MyApp.Controllers { 
export class MyController { 
    dtOptions: any; 

    static $inject = [ 
     "$scope" 
    ]; 

    constructor(
     private $scope: IControllerScope, 
     private dtOptionsBuilder: any 
    ) { 
     this.dtOptions = this.dtOptionsBuilder 
      .newOptions() 
      .withPaginationType('full_numbers') 
      .withDisplayLength(10) 
      .withOption('bInfo', false) 
      .withOption('bPaginate', false) 
      .withOption('searching', false) 
      .withOption('paging', false) 
      .withOption('order', [0, 'desc']); 

    } 
} 
} 

describe("controller",() => { 
var controller: MyApp.Controllers.MyController; 
var dtOptionsBuilder: any; 

beforeEach(angular.mock.module('app')); 

beforeEach(angular.mock.module($provide => { 
    $provide.service('dtOptionsBuilder', function() { 
     this.newOptions = jasmine.createSpy('newOptions').and.callFake(() => { 
      return {}; 
     }); 
     this.withPaginationType = jasmine.createSpy('withPaginationType').and.callFake(() => { 
      return null; 
     }); 
     this.withDisplayLength = jasmine.createSpy('withDisplayLength').and.callFake(() => { 
      return null; 
     }); 
     this.withOption = jasmine.createSpy('withOption').and.callFake(() => { 
      return {}; 
     }); 
    }); 
    return null; 
})); 



beforeEach(inject(function(_$controller_,_dtOptionsBuilder_, _$rootScope_) { 
    $scope = _$rootScope_.$new(); 
    dtOptionsBuilder = _dtOptionsBuilder_; 


    controller = new MyApp.Controllers.MyController($scope, dtOptionsBuilder); 
})); 

describe("on creation ->",() => { 

    it("should initialize the controller",() => { 
     expect('test1').toBe('test1'); 
    }); 
}); 

});

我得到一个错误 “this.dtOptionsBuilder.newOptions(...)。withPaginationType不是一个函数”

任何帮助,将不胜感激

+0

非常感谢! –

回答

0

我不是100%肯定,但我想你需要定义dtOptionsBuilder因此它可以是注射:

app.factory('dtOptionsBuilder', [function() { 
    var dtOptionsBuilder = null; // initialize here... 
    return dtOptionsBuilder; 
}]); 

一旦你做到了,你可以把它注射:

export class MyController { 
    private dtOptions: any; 

    static $inject = [ 
     "$scope", 
     "dtOptionsBuilder" // you need to indicate that it needs to be injected 
    ]; 

    constructor(
     private $scope: IControllerScope, 
     dtOptionsBuilder: any // removed private 
    ) { 
     this.dtOptions = dtOptionsBuilder.newOptions() 
             .withPaginationType('full_numbers') 
             .withDisplayLength(10) 
             .withOption('bInfo', false) 
             .withOption('bPaginate', false) 
             .withOption('searching', false) 
             .withOption('paging', false) 
             .withOption('order', [0, 'desc']); 

    } 
}