2013-04-27 58 views
3

我被困了几个小时,因为我是Jasmine和Angularjs的新手。基本上,我有这个控制器。如何为角度控制器和服务编写茉莉花测试?

angular.module('toadlane.controllers', []). 
    controller('MainController', function($scope, $http, SomeService) { 

     var promise = SomeService.getObjects(); 

     promise.then(function(data) { 
      if(data.length > 0) { 
       $scope.objs = data; 
      } else { 
       $scope.message = "Please come back soon"; 
      } 
     }); 
    }); 

我怎么能写茉莉花测试,以模拟SomeService存根出data和模拟,如果有数据scope的长度不应该是0,如果data是[]消息应该是“请很快回来”。

'use strict'; 

describe('controllers', function() { 
    var scope, someService; 
    beforeEach(module('services')); 
    beforeEach(module('controllers')); 
    beforeEach(inject(function (SomeService) { 
     someService = SomeService; 

     var callback = jasmine.createSpy(); 
     someService.getObjs().then(callback); 
    })); 

    it('should return some objs', inject(function ($rootScope, $controller) { 
     scope = $rootScope.$new(); 

     expect($controller('MainController', {$scope: scope, SomeService : someService})).toBeTruthy(); 

     expect(scope.objs.length).toEqual(2); 
    })); 

    it('should return no objs', inject(function ($rootScope, $controller) { 
     scope = $rootScope.$new(); 

     expect($controller('MainController', {$scope: scope, SomeService : someService})).toBeTruthy(); 


     expect(scope.message).toEqual("Please come back soon"); 
    })); 

}); 

测试还没有完成,因为我不知道如何存根thenpromise

任何帮助是非常赞赏。谢谢。

+0

对不起,我现在不能提供更长的答案,但我会将'SomeService.getObjs'存根为一个假函数,它会返回由您控制的自定义承诺(由'$ q'完成)。 – 2013-04-27 20:45:26

+0

非常感谢您的回复,但是如果您稍后可以给我示例代码。那简直太好了。 – toy 2013-04-27 20:57:42

+0

另外我试图做到这一点,但我不知道如何存根回调函数参数。 – toy 2013-04-27 20:58:26

回答

7

延迟可以通过用链接方法返回对象的函数来模拟promise来测试。在这种情况下,嘲讽SomeService.getObjs应返回一个方法为then的对象。

为了做到这一点再添一个beforeEach声明:

beforeEach(module(function ($provide) { 
    $provide.value('SomeService', { 
    getObjs: function() { 
     return { 
     then: function (callback) { 
      // mockedResponseData is passed to callback 
      callback(mockedResponseData); 
     } 
     }; 
    } 
    })); 

嘲笑服务将立即加载导致现有承诺回调函数。