2014-10-01 52 views
1

我可以測試 - $ scope.dvModel = DienstverlenerDetailService.query(); - 相應地。我無法弄清楚如何測試註釋掉的行。當然可以使用一些指導。單元測試指導控制器返回承諾的REST調用

angular.module('dvb.controllers').controller('ServiceFacilitatorEditController', ['$scope', 'DienstverlenerDetailService', function(

    $scope, 
    DienstverlenerDetailService) { 
    'use strict'; 

    $scope.dvModel = DienstverlenerDetailService.query(); 

    /*DienstverlenerDetailService.query().$promise.then(
     function(response) { 
      $scope.dvModel = response.data; 
     }, 
     function(error) { 

     } 
    );*/ 
}]); 



describe('serviceFacilitatorEditController', function() { 
    'use strict'; 

    beforeEach(module('dvb.ui')); 

    var scope, ctrl, fact, json, $rootScope, $compile, $controller, $injector; 

    beforeEach(function() { 
     inject(function(_$rootScope_, _$compile_, _$controller_, _$injector_) { 
      $rootScope = _$rootScope_; 
      $compile = _$compile_; 
      $controller = _$controller_; 
      $injector = _$injector_; 
     }); 

     jasmine.getFixtures().fixturesPath = 'base/src/main/webapp/stubs/'; 
     var f = readFixtures('servicefacilitator_0'); 
     json = JSON.parse(f); 

     scope = $rootScope.$new(); 

     var DienstverlenerDetailService = { query: function() {} }; 
     spyOn(DienstverlenerDetailService, 'query').and.returnValue(json); 
     ctrl = $controller('ServiceFacilitatorEditController', { 
      $scope: scope, 
      DienstverlenerDetailService: DienstverlenerDetailService 
     }); 
    }); 

    it('it should....', function() { 
     expect(scope.dvModel.data).toBe(json.data); 
    }); 
}); 

看着),一對夫婦的其他職位,其中使用$ Q,$ rootscope.apply(和/或其他東西來解決的承諾,但我似乎無法把它粘起來。我把握這個概念,但仍然感到奇怪的是,1條單線能夠完美測試,但另一個符號不是。

我問這個的主要原因是:1 - 我想了解 2 - 我不能只是把$ scope.vdModel的承諾,我需要什麼數據屬性包裝內。

回答

1

當你窺探DienstverlenerDetailServicequery方法。返回值爲$promise的物件作爲承諾,您可以使用$q.when。還要注入$q服務。

 spyOn(DienstverlenerDetailService, 'query'). 
         and.returnValue({$promise:$q.when(json)}); 

而在你的期望做到: -

it('it should....', function() { 
    scope.$digest(); //<-- Apply digest for the promise to be resolved. 
    expect(scope.dvModel.data).toBe(json.data); //<-- Now set the expectation 
}); 

我想補充的,當你創建一個模擬的服務,你也許可以做到在不同的是,以及(我一般喜歡),而不是創建一個匿名函數被窺探,你可以使用jasmine.createSpyObj創建模擬對象,並在你可能想要測試的模擬上添加任意數量的方法。

DienstverlenerDetailService = jasmine.createSpyObj('DienstverlenerDetailService', ['query']); 

    DienstverlenerDetailService.query.and.returnValue({$promise:$q.when(json)}); 

同樣,如果你有嘲笑其他方法,以及你可以這樣做: -

DienstverlenerDetailService = jasmine.createSpyObj('DienstverlenerDetailService', ['query', 'save', 'delete', ...etc]); 

//And set return value for specific methods... 
+0

我很欣賞這個簡潔的指導,它的工作原理。 – 2014-10-01 13:57:00

+0

@SanJayFalcon不客氣..我已經更新了另一種技術來創建模擬以及.. – PSL 2014-10-01 14:14:54