2015-10-25 94 views
1

我試圖嘲笑我正在使用的服務,應該返回一個承諾,模擬服務正在被調用,但我無法得到我的測試結果。被測試無法獲得承諾角度服務的結果

服務功能:

function getDevices() { 
      console.log('getDevices'); 
      return servicesUtils.doGetByDefaultTimeInterval('devices') 
       .then(getDevicesComplete); 

      function getDevicesComplete(data) { 
       console.log('getDevicesComplete'); 
       var devices = data.data.result; 
       return devices; 
      } 
     } 

我的測試是:

describe('devicesService tests', function() { 
    var devicesService; 
    var servicesUtils, $q, $rootScope; 

    beforeEach(function() { 
     servicesUtils = {}; 

     module('app.core', function ($provide) { 
      servicesUtils = specHelper.mockServiceUtils($provide, $q, $rootScope); 
     }); 

     inject(function (_devicesService_, _$q_, _$rootScope_) { 
      devicesService = _devicesService_; 
      $q = _$q_; 
      $rootScope = _$rootScope_.$new(); 
     }); 
    }); 

    it('getting device list', function() { 
     console.log('getting device list'); 
     devicesService.getDevices().then(function (result) { 
      console.log(result); 
      expect(result).toBeDefined(); 
     });  
    }); 
}); 

模擬文件:

function mockServiceUtils($provide, $q) { 
     var servicesUtils = {}; 
     servicesUtils.doGetByDefaultTimeInterval = jasmine.createSpy().and.callFake(function() { 
      var deferred = $q.defer(); 
      deferred.resolve('Remote call result'); 
      $rootScope.$digest(); 
      return deferred.promise; 
     }); 

     $provide.value('servicesUtils', servicesUtils); 

     return servicesUtils; 
    } 
+0

你需要使用$ rootScope $爲了消化的承諾火 –

+0

@DayanMorenoLeon我增加了消化,但雖然範圍定義摘要方法是不確定的。 ,我修改了我的問題 –

+0

以及你的模擬沒有定義範圍,你的測試ddi。所以嘗試在getDevices被調用後執行摘要 –

回答

1

你的代碼是太複雜。

假設您要測試使用另一個服務servicesUtils的服務devicesService,該服務具有返回承諾的方法。 讓我們假設devicesService的責任是呼籲servicesUtils並改變其結果。

這是我會怎麼做:

describe('devicesService', function() { 

    var devicesService, servicesUtils; 

    beforeEach(module('app.core')); 
    beforeEach(inject(function(_devicesService_, _servicesUtils_) { 
    devicesService = _devicesService_; 
    servicesUtils = _servicesUtils_; 
    })); 

    it('should get devices', inject(function($q, $rootScope) { 
    spyOn(servicesUtils, 'doGetByDefaultTimeInterval').and.returnValue($q.when('Remote call result')); 

    var actualResult; 
    devicesService.getDevices().then(function(result) { 
     actualResult = result; 
    }); 
    $rootScope.$apply(); 

    expect(actualResult).toEqual('The transformed Remote call result'); 
    })); 
}); 
+0

謝謝,它的工作原理! 我想知道我應該怎麼做,以防萬一我想要servicesUtils間諜將在不同的文件,將可以從多個測試文件訪問。這就是我想要做的,但對我來說這並不起作用,有什麼想法? –

+0

我不明白這一點。每個測試都應該有自己的場景,因此應該以不同的方式監視服務。 –