如何使用 Jasmine 测试 AngularJS 控制器的 Promise 返回值?

2023-12-06

我有一个控制器,它公开一个函数,该函数在休息调用后返回一些文本。它工作得很好,但我在用 Jasmine 测试它时遇到了麻烦。测试中 Promise 处理程序内的代码永远不会执行.

控制器:

/* global Q */
'use strict';
angular.module('myModule', ['some.service'])
    .controller('MyCtrl', ['$scope', 'SomeSvc', function ($scope, SomeSvc) {

        $scope.getTheData = function (id) {
            var deferred = Q.defer();
            var processedResult = '';
            SomeSvc.getData(id)
                .then(function (result) {
                    //process data
                    processedResult = 'some stuff';
                    deferred.resolve(processedResult);
                })
                .fail(function (err) {
                    deferred.reject(err);
                });
            return deferred.promise;
        }
    }]);

考试:

describe('some tests', function() {
    var $scope;
    var $controller;
    var $httpBackend;
    beforeEach(function() {
        module('myModule');
        inject(function(_$rootScope_, _$controller_, _$httpBackend_) {
            $scope = _$rootScope_.$new();
            $controller = _$controller_;
            $httpBackend = _$httpBackend_;
            //mock the call that the SomeSvc call from the controller will make
            $httpBackend.expect('GET', 'the/url/to/my/data');
            $httpBackend.whenGET('the/url/to/my/data')
                .respond({data:'lots of data'});
            $controller ('MyCtrl', {
                $scope: $scope
            });
        });
    });

    describe('test the returned value from the promise', function() {
        var prom = $scope.getTheData(someId);
        prom.then(function(result) {
            expect(result).toBe('something expected');  //this code never runs
        })
    });
});

任何里面的东西then除非调用承诺回调,否则不会运行 - 这是像您在这里经历的那样存在误报的风险。由于期望从未运行,因此测试将在此处通过。

有很多方法可以确保您不会得到这样的误报。例子:

A) 回报承诺

Jasmine 将等待承诺在超时时间内得到解决。

  • 如果不及时解决,测试就会失败。
  • 如果承诺被拒绝,测试也会失败。

Beware如果您忘记返回,您的测试将给出假阳性!

describe('test the returned value from the promise', function() {
    return $scope.getTheData(someId)
    .then(function(result) {
        expect(result).toBe('something expected');
    });
});

B) 使用doneJasmine 为测试方法提供的回调

  • If done在超时时间内未调用测试将失败。
  • If done使用参数调用测试将失败。
    这里的catch会将错误传递给jasmine,你会看到错误 在输出中。

Beware如果您忘记了捕获,您的错误将被吞没,并且您的测试将因通用超时错误而失败。

describe('test the returned value from the promise', function(done) {
    $scope.getTheData(someId)
    .then(function(result) {
        expect(result).toBe('something expected');
        done();
    })
    .catch(done);
});

C) 使用间谍和手动启动(同步测试)

如果您不完美,这可能是编写测试的最安全方法。

it('test the returned value from the promise', function() {
    var
      data = { data: 'lots of data' },
      successSpy = jasmine.createSpy('success'),
      failureSpy = jasmine.createSpy('failure');

    $scope.getTheData(someId).then(successSpy, failureSpy);

    $httpBackend.expect('GET', 'the/url/to/my/data').respond(200, data);
    $httpBackend.flush();

    expect(successSpy).toHaveBeenCalledWith(data);
    expect(failureSpy).not.toHaveBeenCalled();
});

同步测试技巧
当需要让控制器/服务运行时,您可以手动启动 httpBackend、超时和范围更改更进一步. $httpBackend.flush(), $timeout.flush(), scope.$apply().

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

如何使用 Jasmine 测试 AngularJS 控制器的 Promise 返回值? 的相关文章

随机推荐

  • JPanel 不绘画,JFrame 保持空白

    我正在开发一款类似于数字口袋妖怪卡牌的游戏 当我尝试绘制任何图像时 JFrame 仍为空 这可能是一个简单的错误 但我一直无法找到解决方案 在 Stack Overflow 上 我看到了很多像我这样的问题 尽管他们的解决方案不适用于我的代码
  • 如何将图像(播放器)旋转到鼠标方向?

    我正在考虑在 pygame 中制作一个 2d 射击游戏 我想让我的玩家 Player 1 指向鼠标方向 我花了几个小时寻找解决方案 并尝试了我能找到的所有解决方案 但没有一个有效 所以你能帮助我吗 这是我的代码 import pygame
  • 纯 JavaScript,onclick 无法在移动设备上运行

    现在我并不是真正的 Javascript 明星 但我似乎遇到了移动设备和 onclick 功能的所有已知问题 Onclick 需要鼠标操作 当然在手机上不适用 现在在 Jquery 中 您可以使用 on 但是这如何与常规 javascrip
  • 无法解析“SingleSignOutFilter”中的“setCasServerUrlPrefix”

    最近升级了依赖 CAS 进行身份验证的 Spring Boot 应用程序后 该项目不再编译 因为setCasServerUrlPrefix找不到方法SingleSignOutFilter java cannot find symbol sy
  • R:覆盖栅格图层的xy坐标

    我有一个带有 XY 像素坐标的栅格 我想将其转换为纬度和经度 class RasterLayer dimensions 1617 1596 2580732 nrow ncol ncell resolution 1 1 x y extent
  • 使用 C# Process 运行可执行程序

    我是一名生物信息学人员 我的工作使用 C 我已经多次使用 C 中的进程来运行可执行程序 这次我有一个新问题 我在 Windows 中下载了一个名为 Blast 的程序的 exe 文件 如果我输入我的命令 blastp query input
  • python 中 GSDMM 的实际示例?

    我想使用 GSDMM 将主题分配给我的数据集中的一些推文 我发现的唯一例子 1 and 2 不够详细 我想知道您是否知道一个显示 GSDMM 是如何使用 python 实现的来源 或者足够关心做一个小例子 我最终编译了 GSDMM 的代码
  • 无法升级Android SDK

    我已经关闭了所有窗口 重新启动了计算机 但 Eclipse 告诉我 C Program Files android sdk tools 正在被访问 我什至删除了该目录 但我仍然得到 如何修复 无法重命名目录 C Program 文件 And
  • 使用 ToString() 格式化时小数和双精度之间的舍入差异

    使用格式化数值时我发现结果存在差异ToString F2 0 125m ToString F2 CultureInfo InvariantCulture 0 13 0 125 ToString F2 CultureInfo Invarian
  • 将所有并排单词成对分割字符串单词[关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我需要将字符串分割成单词 然后将每个连续的单词成对连接 如下所示 This is my
  • 检查文件/文件夹访问权限

    我得到一个UnautorizedAccessException运行这段代码 string fileList Directory GetFiles strDir strExt 异常发生在c users username appdata如何检查
  • Worklight 构建错误无法初始化 ClientProjectBuilder

    我突然开始收到如下所示的工作灯构建错误 我不知道为什么它突然开始发生 该代码工作正常 直到我用于 Xcode 构建的远程计算机重新启动 有什么线索可能导致它吗 ipad 构建失败 初始化 ClientProjectBuilder 失败 an
  • Amazon sns(推送通知)不发送到 IOS 应用程序

    最近app收不到通知 android端正常 ios端却失败 所以这就是我的尝试 1 generate token from apple apn service 2 create the endpoint at amazon backend
  • 代码行分析器是否需要解析树,这是否足够?

    我正在尝试确定为某种语言 例如可用于 Python 和 Matlab 的语言 编写线路分析器所需的条件 解释 行分析器 的一种天真的方法是假设可以在每一行周围插入时间记录 但行的定义取决于解析器如何处理空格 这只是第一个问题 似乎需要使用解
  • 跳出包含 switch 语句的 while 循环

    我无法弄清楚如何跳出包含 switch 语句的循环 Break 从开关中中断 而不是从循环中中断 可能有一个更优雅的解决方案 我已经实现了一个标志 该标志一开始为 true 然后设置为 false 然后结束循环 您能提供更好的解决方案吗 背
  • Dash Plotly 日期时间选择

    Dash 世界中是否有任何东西可以提供一个很好的界面来输入日期时间 时间增量 无论什么类型 np pd dt 等 我目前只能找到真正支持日期的代码https dash plotly com dash core components date
  • 如何循环遍历动态表单输入并将其插入数组

    我有一个表单 要求用户在多个表单字段中输入数字 他们可以选择他们想要的表单字段数量 我已将表单字段标记为 df1 df2 df3 等 对于用户添加的每个额外表单字段 只需在 df 后面的数字上加 1 我的问题是尝试捕获 使用 PHP 这些字
  • 如何使用模拟匿名类型的设置?

    我有以下存储库 interface IReportingRepository where T Report IEnumerable
  • Heroku + node.js 错误(Web 进程未能在启动后 60 秒内绑定到 $PORT)

    我有我的第一个node js应用程序 在本地运行良好 但我无法通过heroku部署它 也是第一次使用heroku 代码如下 SO 不允许我编写这么多代码 所以我只想说在本地运行代码以及在我的网络中都没有问题 var http require
  • 如何使用 Jasmine 测试 AngularJS 控制器的 Promise 返回值?

    我有一个控制器 它公开一个函数 该函数在休息调用后返回一些文本 它工作得很好 但我在用 Jasmine 测试它时遇到了麻烦 测试中 Promise 处理程序内的代码永远不会执行 控制器 global Q use strict angular