我使用$resource设置了一些API调用,并且在测试时,我采用了注入(inject)$q然后执行的一般方法
mockMyService.doSomethingAsync.andReturnValue($q.when(successResponse))
这已经很好地解决了问题,但是,我有一个如下所示的方法:

# MyService
MyService.doSomethingAsync(params).$promise.then ->
    $scope.isLoading = false

# MyService Spec
mockMyService =
  doSomethingAsync: jasmine.createSpy('doSomethingAsync')

it 'calls service #doSomethingAsync', ->
  inject ($q) -> mockMyService.doSomethingAsync.and.returnValue($q.when(response))
  controller.methodThatWrapsServiceCall()
  scope.$apply()

  expect(mockMyService.doSomethingAsync).toHaveBeenCalled()

不幸的是,当最后将$promise.then链接起来时,上面概述的模拟策略似乎不起作用。 我最终遇到以下错误:

TypeError: 'undefined' is not an object (evaluating 'MyService.doSomethingAsync(params).$promise.then')

仅使用doSomethingAsync().$promise结尾的方法使用该模拟策略即可顺利通过测试。

(其他信息:这些是使用Karma和PhantomJS运行的Jasmine测试)

最佳答案

其实,想通了!

我刚刚更改了我的模拟返回and.returnValue( { $promise: $q.when(response) } )

10-04 15:47