测试angularjs'工厂与卡玛

时间:2014-11-10 13:37:02

标签: javascript angularjs karma-runner karma-jasmine

我用AngularJs编写了一个Factory,它有一个返回http promise的方法。

'use strict'

angular.module('projDefinitApp')
.factory 'testService', ($http) ->
  {  getTest: (testID) ->
    $http.get "temp/test.json"
  }

我在使用业力和茉莉花进行测试时遇到了一些问题。承诺没有返回任何结果。我尝试创建一个var,然后调用该函数并更改var的值。但它没有更新价值:

'use strict'
describe 'Service: testService', ->
  # load the service's module
  beforeEach module 'projDefinitApp'

  # instantiate service
  testService = {}
  beforeEach inject (_testService_) ->
    testService = _testService_

  it 'should do something', ->
    retrieved = undefined
    testService.getTest().success ($data,retrieved) ->
      retrieved = $data
      return
    expect(retrieved).toBe(null)
    return
  return

控制台出口如下所示

  

PhantomJS 1.9.8(Linux)服务:testService应该做一些失败的事情

     

预期未定义为null。

1 个答案:

答案 0 :(得分:2)

在测试中,Angular不会立即执行$http服务发出的请求。原因是所有请求都排队等待在Angular生命周期的$digest阶段运行。您需要在测试中手动运行Angular的摘要周期,方法是调用$rootScope.$apply()$httpBackend.flush(),这将在内部进行调用。

我在当前测试中看到的一个问题是测试不能异步工作,不能保证在调用期望之前设置retrieved,因为promises是异步解析的。您重写测试以使其异步工作:

it 'should do something', (done) ->
  testService.getTest().success ($data) ->
    expect($data).toBe(null)
    done()
    return

  $rootScope.$apply()
  return
return