【问题标题】:Angular Jasmine (1.3) Controller Mock Service testingAngular Jasmine (1.3) 控制器模拟服务测试
【发布时间】:2014-11-22 01:43:53
【问题描述】:

这类问题可能太多了,但我没有找到一个好的解决方案。 在我看来,这个问题应该太普遍了。 脏伪代码: 控制器

app.controller('Acontroller',function($scope,$q, Aservice){

  $scope.someScopeVariable = null;

  function refresh(){
    $q.all([
    Aservice.getCollectionA().then(function(results){
      return $scope.collectionA = results}),
    Aservice.getCollectionB().then(function(results){
      return $scope.collectionB = results})
     ]);
    };

    $scope.someScopeFunction = function(){
       Aservice.someServerUpdateCall().then(function(){
         refresh().then(function(){
           $scope.someScopeVariable = 'woot'
         }
       }
     }
 })

这真的只是写得很糟糕吗?我正在撕掉我光头上剩余的胡茬,试图测试 someScopeFunction。

你会如何测试这个? (Karma 上的 Jasmine (1.3))

我可以测试第一层的承诺,但我不能简单地断言刷新函数被调用。我可以模拟该服务,但我很难窥探该刷新功能。我假设我必须实例化控制器(找到了一个类似的解决方案),尽管这看起来有点疯狂。

所以(请原谅咖啡脚本):

describe 'Acontroller', ->
  mockService = {}
  aResponseObject =
    a:1
    b:2
  beforeEach -> module('app')

  beforeEach inject ($controller,$q, $rootScope) ->

    emptyPromise = ->
      defer = $q.defer
      defer.resolve()
      defer.promise


    responsePromise = ->
      defer = $q.defer()
      defer.resolve([aResponseObject],[aResponseObject])
      defer.promise

    mockService.getCollectionA = jasmine.createSpy('getCollectionA').andReturn responsePromise()
    mockService.getCollectionB = jasmine.createSpy('getCollectionB').andReturn responsePromise()
    mockService.someServerUpdateCall = jasmine.createSpy('someServerUpdateCall').andReturn emptyPromise()
    scope = $rootScope.$new()
    $controller 'Acontroller',
      $scope: scope
      Aservice: mockService

    $rootScope.$apply  ## resolve promises

  describe 'someScopeFunction', ->

    it 'should call Aservice with someServerUpdateCall', ->

      scope.someScopeFunction()
      scope.$digest
      expect(Aservice.someSererUpdateCall).toHaveBeenCalled() ##this should work

这种预期效果很好,但确认下一次刷新调用是我不知所措的地方。鉴于它与范围无关,我会假设我必须实例化控制器?

我尝试过其他策略,包括:

done = false
refresh = jasmine.createSpy('refresh')

scope.someScopeFunction().then() -> done = true

waitsFor -> done

runs ->
  scope.$apply ->
    expect(refresh).toHaveBeenCalled()

但无济于事,promise 没有解决。

我听说 Mocha 让异步调用更简单一些,但我真的很害怕重新开始。

【问题讨论】:

    标签: angularjs unit-testing karma-jasmine


    【解决方案1】:

    所以,我想我想通了。 我更改了作用域上的原始函数以注入 refresh() 函数。 然后在返回 Promise 的测试中注入间谍后,在作用域上调用 $digest。

    $scope.someScopeFunction = (refreshFn=refresh)
      Aservice.someServerUpdateCall().then ->
        refreshFn().then ->
          $scope.someScopeVariable = 'woot'
    

    那么测试将是:

    describe 'Acontroller', ->
    
      mockService = {}
      mocks = {}
      aResponseObject =
        a:1
        b:2
      beforeEach -> module('app')
    
      beforeEach inject ($controller,$q, $rootScope) ->
    
        mocks.emptyPromise = ->
          defer = $q.defer
          defer.resolve()
          defer.promise
    
    
        mocks.responsePromise = ->
          defer = $q.defer()
          defer.resolve([aResponseObject],[aResponseObject])
          defer.promise
    
        mockService.getCollectionA = jasmine.createSpy('getCollectionA').andReturn mocks.responsePromise()
        mockService.getCollectionB = jasmine.createSpy('getCollectionB').andReturn mocks.responsePromise()
        mockService.someServerUpdateCall = jasmine.createSpy('someServerUpdateCall').andReturn mocks.emptyPromise()
    
        scope = $rootScope.$new()
    
        $controller 'Acontroller',
          $scope: scope
          Aservice: mockService
    
        $rootScope.$apply  ## resolve promises
    
      describe 'someScopeFunction', ->
    
        it 'should call refresh() after someServerUpdateCall', ->
          refresh = jasmine.createSpy('refresh').andReturn(mocks.emptyPromise())
          scope.someScopeFunction(refresh)
          scope.$digest ->
            expect(refresh).toHaveBeenCalled()
    

    【讨论】:

      猜你喜欢
      • 2013-05-04
      • 2017-06-03
      • 1970-01-01
      • 1970-01-01
      • 2014-01-16
      • 2015-07-07
      • 1970-01-01
      • 2015-03-20
      • 1970-01-01
      相关资源
      最近更新 更多