Angular 单元测试 Jasmine Spy 错误

2024-03-21

以下控制器收到类型错误:“未定义”不是函数(正在评估sessionService.getCurrentPlace())。我有一个模拟服务,该方法正在被监视。模拟服务上的另一种方法工作正常。我试过了.AndReturns({..})关于间谍以及.AndCallThrough()但没有运气。知道我错过了什么,还是我做错了?非常感谢!

控制器:

    'use strict';

angular.module('wallyApp')
    .controller('addGatewayCtrl', function ($scope, $location, $filter, sessionService) {
        /*
            private members
        */
        //set scope from session data
        $scope.processSession = function (places) {
            $scope.currentPlaceId = sessionService.getCurrentPlace();
            if (!$scope.currentPlaceId) {
                $scope.currentPlaceId = places[0].id;
            }
            $scope.place = $filter("getById")(places, $scope.currentPlaceId);
            $scope.ready = true;
        };

        /* 
            setup our scope
        */
        $scope.currentPlaceId = null;
        $scope.place = {};
        $scope.videoSrc = "/videos/gateway-poster.gif";
        $scope.loaded = true;

        /*
            setup controller behaivors
        */

        //set video or gif to show or hide video
        $scope.setVideo = function () {
            $scope.videoSrc = "/videos/gateway.gif";
        };
        $scope.setPoster = function () {
            $scope.videoSrc = "/videos/gateway-poster.gif";
        };
        //initialize scope
        $scope.setVideo();

        //submit form
        $scope.continue = function () {
            $location.path("/setup/pair-gateway");
            return false;
        };
        //cancel
        $scope.back = function () {
            $location.path("/setup/plan-locations");
            return false;
        };
        //wifi
        $scope.gotoWifi = function () {
            $location.path("/setup/wifi");
            return false;
        };


        /*
            setup our services, etc
        */
        //get our places from the cache
        sessionService.get("places").then(function (places) {
            if (!places || places.length < 1) {
                sessionService.refreshPlaces(); //Note we don't care about the promise as our broadcast watch will pick up when ready
            } else {
                $scope.processSession(places);
            }
        }).catch(function (error) {
            //TODO:SSW Call Alert Service??
        });

        //Watch broadcast for changes
        $scope.$on("draco.placesRefreshed", function (event, data) {
            sessionService.get("places").then(function (places) {
                $scope.processSession(places);
            });
        });
    });

单元测试:

    'use strict';

describe('addGatewayCtrl', function () {
    var $q,
        $rootScope,
        $location,
        $scope,
        $filter,
        mockSessionService,

        completePath = "/setup/pair-gateway",
        backPath = "/setup/plan-locations",
        wifiPath = "/setup/wifi",
        sessionDeferred,
        sessionInitDeferred,

        mockPlaces = [{ id: "0001" }];

    beforeEach(module('wallyApp'));

    beforeEach(inject(function (_$q_, _$rootScope_, _$location_, _$filter_) {
        $q = _$q_;
        $location = _$location_;
        $rootScope = _$rootScope_;
        $filter = _$filter_;
    }));

    beforeEach(inject(function ($controller) {
        $scope = $rootScope.$new();

        mockSessionService = {
            get: function (contact) {
                sessionDeferred = $q.defer();
                return sessionDeferred.promise;
            },
            getCurrentPlace: function () {
                return mockPlaces[0].id;
            },
            refreshPlaces: function () {
                sessionInitDeferred = $q.defer();
                return sessionInitDeferred.promise;
            }
        };

        spyOn(mockSessionService, 'get').andCallThrough();
        spyOn(mockSessionService, 'getCurrentPlace').andReturn(mockPlaces[0].id);
        spyOn(mockSessionService, 'refreshPlaces').andCallThrough();

        $controller('addGatewayCtrl', {
            '$scope': $scope,
            '$location': $location,
            '$filter':$filter,
            'sessionService': mockSessionService
        });

    }));

    describe('call session service to get place data ', function () {

        //resolve our mock place and session services
        beforeEach(function () {
            //resolve mocks
            sessionDeferred.resolve(mockPlaces);

            $rootScope.$apply();
        });

        //run tests
        it('should have called sessionService get places', function () {
            expect(mockSessionService.get).toHaveBeenCalledWith("places");
        });
        it('should have called sessionService get currentPlaceId', function () {
            expect(mockSessionService.getCurrentPlace).toHaveBeenCalled();
        });
        it('should have set scope', function () {
            expect($scope.place).toEqual(mockPlaces[0]);
        });

    });

});

所以我想通了。对于嵌套延迟,您必须在其间调用 $scope.$apply() 。以下修复了它(以及对模拟数据响应的一些小更改,但这些都是微不足道的):

        //resolve promises
        activityMessagesDeferred.resolve(mockActivityMessages);
        $rootScope.$apply();
        $rootScope.$broadcast("draco.sessionRefreshed");
        activityCountDeferred.resolve(mockActivityCount);
        $rootScope.$apply();

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

Angular 单元测试 Jasmine Spy 错误 的相关文章

随机推荐

  • 在 ASP.NET Web API 中序列化继承类型

    我在 Web API 中序列化继承的对象时遇到问题 DataContract public class Item DataMember public int ID get set DataMember public string Name
  • CSS - 大于选择器 - 选择大于 N 的项目

    我有一些 p 我的 HTML 正文中的元素 我只想显示前两段 然后设置display none到之后的所有段落 为什么下面的代码不起作用 p p 1 p p 2 p p 3 p p 4 p 我的代码仍然在 Chrome 网络浏览器中显示所有
  • GUI 应用程序中的 Web 技术

    您在使用 Web 技术 HTML XML CSS JavaScript 实现 GUI 应用程序的部分功能方面有什么经验 优点和缺点 请说一下 没有服务器 关系数据库 AJAX 或用于会话管理的 cookie 也没有现有的 Web 应用程序
  • C 标准是否允许自修改代码?

    C 中的自修改代码是否可以以可移植的方式实现 我问的原因是 在某种程度上 OOP 依赖于自修改代码 因为在运行时执行的代码实际上是作为数据生成的 例如在 v 表中 但是 似乎如果这太过分了 它会阻止编译器中的大多数优化 例如 void ad
  • 三张牌排成一行,而不是所有牌排成一列

    我正在使用 React 和 Material UI 我在一个数组中有 40 张动态卡 当我渲染它们时 我想要连续 3 张卡 并将所有卡放在一列中 我正在使用这张卡 https codesandbox io s r084q99q34 http
  • 我可以在 OS X 中进行 Java 6 开发吗?

    我知道当 Leopard 推出时 每个人 嗯 每个 Java 开发人员并且足够关心在 Mac 上进行开发 都对没有 Java 6 SDK 支持感到愤怒 我知道有人在 Leopard 发布几个月后提供了某种破解方法 但我可以发誓 我稍后读到
  • 从我的数据框中创建虚拟变量矩阵;使用“NA”来查找缺失值

    我有一个基于不同年份的数据 重复了几次 我希望我的输出具有等于年数的列 每列代表一年 现在 目的是分别为每年创建虚拟变量 例如 只要主数据中存在与 2000 年平行的非 NA 观测值 2000 年的输出列就必须具有值 1 否则为 0 而且
  • 从 Firebase 通知恢复应用程序不起作用(Xamarin Forms)

    我正在努力整合Firebase 推送通知到我的应用程序 请找到我的火力基地Firebase消息服务 class 如果应用程序打开并运行 则一切正常 但是 如果应用程序未打开 如果我切换到其他应用程序 我的应用程序未关闭 我收到通知 但当我点
  • 帮助在 Rails 中构建模型

    class Profile has many projects through gt teamss has many teams foreign key gt member id has many own projects class na
  • Jenkins:动态作业创建引发“管道 CPS 方法不匹配”错误

    我正在尝试从应并行运行的管道作业之一创建多个动态作业 我希望我的詹金斯管道脚本根据用户输入下载并安装我的软件二进制文件 以下是我的示例阶段 第 1 阶段 将下载构建版本 第 2 阶段 获取参数并安装软件的 云 部分 第 3 阶段 将接受用户
  • Mongoose populate() 返回空数组

    所以我已经花了大约4个小时 阅读了几次文档 但仍然无法找出我的问题 我正在尝试对我的模型执行一个简单的 populate 我有一个用户模型和商店模型 用户有一个 favoriteStores 数组 其中包含商店的 id 我正在寻找的是这个数
  • SQL查询where参数为null不为null

    我正在尝试执行 SQL 查询并根据参数是否为空或否动态构建 where 条件 我有这样的事情 SELECT tblOrder ProdOrder tblOrder Customer FROM tblOrder CASE WHEN Order
  • 找不到模块“内部/错误”离子

    我正在尝试创建新的离子项目 然后它显示以下错误 我已经删除了nodejs npm ionic并再次重新安装 但再次出现相同的错误 Terminal https i stack imgur com vLP7J png Error Error
  • 使用 Ajax 加载用户控件

    我试图找到使用 Ajax 加载用户控件的最佳实践 我的第一种方法是简单地使用 UpdatePanel 并在 ajax 回发上使用 LoadControl 弹出它 但这会在同一 UpdatePanel 中重新呈现其他加载的用户控件 另外 我无
  • cassandra 节点限制

    我正在寻找 cassandra 是否有节点硬件规格的限制 例如如果存在任何此类限制 每个节点的最大存储可能是多少 我打算使用几个节点 每个节点具有 48TB 存储 2TB X 24 硬盘驱动器 7200rpm 并配有一些良好的双 Xeon
  • SMTP 验证错误“发送邮件失败”

    如果满足某些条件 我将尝试从我的 ASP NET 网页发送电子邮件 这是我的代码 SmtpClient smtpClient new SmtpClient NetworkCredential basicCredential new Netw
  • 如何找到 Homebrew 的可安装软件包列表?

    最近我安装了Brew https brew sh 如何检索要安装的可用brew 软件包的列表 brew help将显示可用命令的列表 brew list将显示已安装软件包的列表 您还可以附加公式 例如brew list postgres会告
  • 当请求为 POST 时,在 Apigee HTTPTargetConnection 上调用 GET

    我需要调用使用 GET 的旧版 API 我的 API 代理使用 POST 我尝试使用AssignMessage
  • 将一个字符串更改为另一个字符串的简单突变数量?

    我相信你们都听说过 文字游戏 在这种游戏中 您试图通过一次更改一个字母来将一个单词更改为另一个单词 并且只浏览有效的英语单词 我正在尝试实现一个 A 算法来解决它 只是为了充实我对 A 的理解 并且需要的东西之一是最小距离启发式 也就是说
  • Angular 单元测试 Jasmine Spy 错误

    以下控制器收到类型错误 未定义 不是函数 正在评估sessionService getCurrentPlace 我有一个模拟服务 该方法正在被监视 模拟服务上的另一种方法工作正常 我试过了 AndReturns 关于间谍以及 AndCall