如何使用 Jasmine 监视 Angular 承诺链

2024-02-18

使用 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()到范围。调用此方法时,会对第 3 方 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()

本次测试结果如下:

  • 期望(@exampleService.step1).toHaveBeenCalled() -PASS
  • 期望(@exampleService.step2).toHaveBeenCalled() -FAIL

你能告诉我怎样才能得到step2()测试成功运行?

谢谢

EDIT

下面的@Dashu 友善地提供了问题的答案。诀窍是简单地调用scope.$apply or scope.$digest触发承诺链决议。

这是工作测试片段。

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()

在第二个期望之前尝试 $rootScope.$apply()

还有关于 defer.resolve() 的信息。我不知道这是否真的解决了承诺,我认为它只是设置了解决时返回的值。

所以我会将其移至 $q.defer() 调用下方,然后将承诺传递给 andReturn()

你可以执行 defer.resolve(true), defer.reject(false),所以如果你的承诺将在调用步骤中被拒绝,则将返回 true 或 false

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Jasmine 监视 Angular 承诺链 的相关文章

随机推荐

  • Github - 流量 - 奇怪的“Git 克隆”统计数据

    我有一个 Github 存储库 其中包含一些令人困惑的 Git 克隆统计信息 如下所示 该存储库没有大量访问者或 Stars 但在 9 月 29 日显示了相对较多的克隆 GitHub流量帮助页面 https help github com
  • 如何在 SVG / raphael 中的贝塞尔曲线末端绘制箭头?

    我有一条由此生成的曲线 var path M x1 toFixed 3 y1 toFixed 3 L arrow left x arrow left y L arrow right x arrow right y L x1 toFixed
  • Python 错误:io.UnsupportedOperation:fileno

    我正在使用服务器和客户端程序here http www bogotobogo com python python network programming tcp server client chat server chat client s
  • 等待 IO 的可重用测试代码

    我正在尝试在 WCF 公开的方法 服务上使用 async await 一切工作正常 但我想模拟实际等待 IO 的服务方法 以便服务调用将注册到 IO 完成端口 并将线程放回到线程池中 澄清一下 我只是尝试确认 IO 完成端口的使用情况 并更
  • 通过 Wi-Fi 扫描 MFI 产品

    在 iOS 8 中 Apple 允许我们通过 Wifi direct 连接到设备并与其共享 WiFi 网络凭据 我们可以在 wifi 设置页面中执行此操作 也可以在应用程序中执行此操作 我正在尝试启动扫描来查找 wifi MFI 设备 我可
  • 从 aws lambda 函数调用 django 函数视图

    我想在 AWS Lambda 上运行我的 django 视图 为此 我创建了一个 lambda 函数来调用该视图函数 AWS lambda 函数是这样的 gt import app views as v def functionA hand
  • 日语 COBOL 代码:G 文字和标识符的规则?

    我们正在处理IBMEnterprise日语COBOL源代码 准确描述 G 类型文字中允许的内容的规则 标识符的允许范围尚不清楚 IBM 手册指出 G 文字 引号内的第一个字符必须为 SHIFT OUT 以及 SHIFT IN 作为结束引号之
  • 如何在不使用任何第三方库的情况下在C++中反序列化json字符串[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在 vc 创建一个应用程序以 j
  • Jenkins 与 Jest 集成

    有没有办法将 Jenkins 集成到基于 Jasmine 构建的 Javascript Jest 测试框架中 我尝试将 Jest 与茉莉花记者 https github com larrymyers jasmine reporters 但未
  • R 中 LINQ 风格的数据操作

    我感兴趣 R 中是否有一个包支持调用链式数据操作 例如 C LINQ F 我想启用这样的样式 var list new 1 5 10 12 1 var newList list Where x gt x gt 5 GroupBy x gt
  • 在 for 循环内动态创建按钮以在滚动视图中使用

    我在动态创建按钮时遇到问题 我使用了提供的帮助如何在 Android 中动态创建按钮 https stackoverflow com questions 3011092 how can i dynamically create a butt
  • 每两个表行的第 n 个子级

    我需要将表格的每两行设为灰色 如果可能的话 我更愿意使用 nth child 我已经搞乱了Chris Coyier 的第 n 个孩子测试员 http css tricks com examples nth child tester 但仍然无
  • 在 Haskell 中快速更新大状态

    对于 Haskell 中的矢量图形库 我必须携带一个相当大的状态 线条描边参数 颜色 剪辑路径等 我知道有两种方法可以做到这一点 引用来自的评论哈斯克尔咖啡馆 http www mail archive com haskell cafe h
  • Angular 2 JSONP注入脚本没有调用回调错误

    我正在 localhost 3000 上使用 npm 服务器运行应用程序 服务文件 import Injectable from angular core import Jsonp from angular http import rxjs
  • 为什么在 Java 中要在单独的文件中声明枚举?

    为什么这个枚举在它自己的文件中声明 这样做有什么好处吗 另外我如何才能将其放入两个文件之一中 我真的不知道我在做什么 还请用简单的方式解释一下 因为这是教科书示例 而且我对 Java 还很陌生 刻度名称 java enum ScaleNam
  • 如何使用对象数组中的 usestate 更新状态?

    我在使用 React useState 挂钩时遇到了一些问题 我有一个带有复选框按钮的待办事项列表 我想将 完成 属性更新为 true 该属性与 单击 复选框按钮的 id 具有相同的 id 如果我 console log 我的 toggle
  • 如何使用 PowerShell 使用两个 echo 命令在一行上打印数据

    下面是我用来查找用户创建日期和上次登录日期的代码 然后将其写入 csv 文件 users Get ADuser SearchBase OU testou1 dc US dc ITOPS dc COM Filter properties sa
  • 如何制作一个具有真正多语言字符串的应用程序?

    为不同语言制作字符串的最佳方法应该是什么 我有这个问题 我试图显示 月 月 年 年 等字符串 目前我正在研究我所知道的 3 种语言 西班牙语 英语和波兰语 对于英语和西班牙语来说 这很简单 但例如 在波兰语中 年 可以变成 lata 数字
  • 使用客户端证书身份验证时,为什么我不断收到 NSURLErrorDomain Code=-1206?

    以下代码是我使用之前有关 ios 客户端证书身份验证的帖子中的代码 每个人都说这有效 但为什么它对我有效 我不断收到以下错误 connection didFailWithError Error Domain NSURLErrorDomain
  • 如何使用 Jasmine 监视 Angular 承诺链

    使用 AngularJS CoffeeScript 和 Jasmine 在 WebStorm 中编辑 我想对一系列承诺进行单元测试 假设我有以下示例服务 角度服务 class ExampleService stepData construc