2013-10-31 29 views
16

以下測試不斷失敗,我想不通爲什麼?我試圖弄清楚如何測試茉莉花的叛逆/承諾。測試的角度無極茉莉

錯誤

Expected undefined to be 'Resolved Data'. 

測試

describe('Queued Repository', function() { 
    var ctrl, 
     rootScope, 
     scope, 
     service; 

    beforeEach(function() { 
     module('testApp'); 

     inject(function ($rootScope, $controller, TestSrvc) { 
      rootScope = $rootScope; 
      scope = $rootScope.$new(); 
      service = TestSrvc; 
     }); 
    }); 

    afterEach(inject(function ($rootScope) { 
     $rootScope.$apply(); 
    })); 

    it('test something', function() { 
     expect(service.calculate(1, 5)).toBe(6); 
    }); 

    it('resolves promises', function() { 
     var result; 

     service.getPromise().then(function (data) { 
      result = data; 
     }); 

     rootScope.$apply(); 
     expect(result).toBe('Resolved Data'); 
    }); 
}); 

服務

var app = angular.module('testApp', []); 

app.service('TestSrvc', ['$q', '$timeout', '$http', function ($q, $timeout, $http) { 
    return { 
     getPromise: function() { 
      var d = $q.defer(); 

      $timeout(function() { 
       d.resolve('Defered Result'); 
      }, 5000); 

      return d.promise; 
     }, 
     getSomething: function() { 
      return "Test"; 
     }, 
     calculate: function (x, y) { 
      return x + y; 
     } 
    } 
}]); 
+0

它不應該是'期待(結果).toEqual(「DEFERED結果」);'? –

+0

@JonathanPalumbo - 是的,但它仍然無效。 – Sam

+2

是的,我明白你的意思了,結果是'undefined'。如果它是一個返回'$ http'的承諾,我會建議在聲明之前調用'$ httpBackend.flush()'。但是使用'$ q'服務是另一回事。 –

回答

9

嘗試調用$timeout.flush() b在expect(result).toBe('Resolved Data');之前。

+2

謝謝TON!我仍然需要$ rootScope。$ apply()? – Sam

+1

我得到「意外的請求」 GET HTTP://my.test.service/someObject/someId不要求預期 – FlavorScape

+0

你不是表明你想要測試文件的全部內容,從那裏這個GET電話打進來?爲什麼'$ http'被注入到服務中? –

3

在你的榜樣,您需要通話雙方$timeout.flush()$rootScope.$apply()

說明:$timeout.flush()將迫使你$timeout在服務中立即運行。然後,您的服務將調用'resolve' - 但promise.then()將不會被調用,直到後續的摘要循環;因此您需要致電$rootScope.$apply()傳播任何「解決方案」和「手錶」 - 這將同步發生。

NOTE:在茉莉花,確保您promise.then()功能似乎BEFORE您到$rootScope.$apply通話否則將不發射promise.then()功能。 (我還沒有想通了,爲什麼這是茉莉花的情況。)