使用AngularJS,CoffeeScript和Jasmine(在WebStorm中编辑),我想对一系列承诺进行单元测试.
假设我有以下示例服务:
角度服务
class ExampleService stepData: [] constructor: (@$http) -> attachScopeMethod: (@scope) -> @scope.callSteps = => @step1().then -> @step2() step1: -> @$http.get('app/step/1').then (results) => @stepData[0] = results.data results step2: -> @$http.get('app/step/2').then (results) => @stepData[2] = results.data results
此服务允许我将方法callSteps()附加到范围.调用此方法时,会对第三方API执行一系列异步$http调用.
为了测试每个步骤至少被调用,我写了以下Jasmine规范.
茉莉花规格
ddescribe 'ExampleService',-> beforeEach -> module 'myApp' beforeEach inject ($rootScope,$injector) -> @scope = $rootScope.$new() @exampleService = $injector.get 'exampleService' @q = $injector.get '$q' describe 'process example steps',-> beforeEach -> @exampleService.attachScopeMethod(@scope) it "should attach the scope method",-> expect(@scope.callSteps).toBeDefined() describe 'when called should invoke the promise chain',-> it "should call step1 and step2",-> defer = @q.defer() @exampleService.step1 = jasmine.createSpy('step1').andReturn(defer.promise) @exampleService.step2 = jasmine.createSpy('step2') @scope.callSteps() defer.resolve() expect(@exampleService.step1).toHaveBeenCalled() expect(@exampleService.step2).toHaveBeenCalled()
该测试的结果如下:
> expect(@ exampleService.step1).toHaveBeenCalled() – PASS
> expect(@ exampleService.step2).toHaveBeenCalled() – 失败
你能告诉我如何让step2()在测试中成功运行吗?
谢谢
编辑
@Dashu以下提供了问题的答案.诀窍是简单地调用scope.$apply或scope.$digest来触发promise链解析.
所以这是工作测试片段.
describe 'when called should invoke the promise chain',-> it "should call step1 and step2",-> defer = @q.defer() defer.resolve() @exampleService.step1 = jasmine.createSpy('step1').andReturn(defer.promise) @exampleService.step2 = jasmine.createSpy('step2') @scope.callSteps() @scope.$apply() expect(@exampleService.step1).toHaveBeenCalled() expect(@exampleService.step2).toHaveBeenCalled()