使用 Jasmine 测试 AngularJS 工厂函数

2024-02-13

我对此非常陌生(AngularJS,茉莉花,睾丸),我有这个代码(我简化了一点,只留下重要的部分):

//my_module.js
angular.module('my_module', ['my_data'])
.config([...]);

.controller('my_controller', ['$scope', 'my_data',
    function($scope, my_data) {
        $scope.my_function = function() {
            return my_data.my_factory.save().then(function () {
                console.log('saved');
            },
            function() {                             
                console.log('Error');
            }); 
        }
    }
)

//my_data.js
angular.module('my_data', [])
.factory('my_factory', ['$q', '$rootScope',
    function($q, $rootScope) {
        var my_factory= function(my_data) {
            angular.extend(this, my_data);
        }
        my_factory.prototype.save = function() {
            var deferred = $q.defer();
            setTimeout(function() {
                deferred.resolve();
            $rootScope.$apply();
            }, 1000);

            return deferred.promise;
        }
        return my_factory;
    }
])

所以,我想做的是测试当 my_module.my_controller.my_function 被触发时是否调用 my_data.my_factory.save 。

//my_test.js
describe('testing my_controller.my_function', function () {
    beforeEach(module('my_module'));

    var $rootScope, $controller;
    beforeEach(inject(function(_$rootScope_, _$controller_) {
        $rootScope = _$rootScope_;
        $controller = _$controller_;
    }));

    scope = $rootScope.$new();

    it('should call the save function', function() {
        scope.my_function();
        expect(my_data.save).toHaveBeenCalled();
    });
}

我需要一点帮助。


你离你需要的并不太远。首先按照你的要求my_data as my_module依赖,不需要注入my_module对于控制器来说,只是工厂(my_factory);

其次,你想利用ngMock http://docs.angularjs.org/guide/dev_guide.unit-testing。这些文档不是很完整,但提供了很好的见解。更多的here http://docs.angularjs.org/api/angular.mock.inject and a 例子在这里 https://github.com/mhevery/foodme(寻找test/unit/controllers).

基本上,您想要做的是模拟该服务,以便您可以确信它已被调用。为了实现它,注入$provide给你的angular.mock.module打电话并提供一个嘲笑my_factory服务。实现它的最好方法是这样的:

describe('testing my_controller.my_function', function () {
  var mockedFactory, $rootScope, $controller;

  beforeEach(module('my_module', function($provide) {
    mockedFactory = {
      save: jasmine.createSpy()
    };

    $provide.value('my_factory', mockedFactory);
  }));

  beforeEach(inject(function(_$rootScope_, _$controller_) {
    $rootScope = _$rootScope_;
    $controller = _$controller_;
  }));

  scope = $rootScope.$new();

  it('should call the save function', function() {
    scope.my_function();
    expect(mockedFactory.save).toHaveBeenCalled();
  });
}

这样你就可以覆盖my_factory依赖性。

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

使用 Jasmine 测试 AngularJS 工厂函数 的相关文章

  • grunt jasmine-node 测试运行两次

    我设置 grunt 来运行 node js 茉莉花测试 由于某种原因 使用此配置 结果总是显示双倍的测试 这是我的配置 我在用着茉莉花节点 https github com jasmine contrib grunt jasmine nod
  • 从 C# 程序集中执行 JavaScript

    我想从 C 程序集中执行 JavaScript 代码 并将 JavaScript 代码的结果返回到调用 C 代码 定义我不想做的事情更容易 我并不是试图从我的代码隐藏中调用网页上的 JavaScript 函数 我不想加载 WebBrowse
  • AngularJS、ocLazyLoad 和加载动态状态

    app define angular angular ui router ocLazyLoad config common layout services menuService function angular use strict va
  • angular.isdefine 有什么好处?

    有什么好处angular isdefined超过和超过foo undefined 我一时想不出有什么好处 在 Javascript 中以任何方式访问真正未定义的变量 除了 typeof 都会抛出错误 你只能使用Angular isDefin
  • 将数据发送到 parse.com 并更新 Angular $scope

    我正在将数据发送到 parse com 上的类 我想运行此函数并更新 scope无需重新加载视图 创建一个Programme运行下面的函数工作正常 但是有时在创建新程序后不会更新视图 并且需要刷新页面 当调用整个函数时 如底部所示 getP
  • 我将与 ng-include 一起使用什么文件路径?

    我的角度项目的路径是这样的 web server py flask server program app static app js controllers js etc templates index html home html 索引
  • 使用 google test 进行数据驱动的单元测试

    我目前正在使用以下方法为嵌入式应用程序编写单元测试谷歌单元测试框架 https github com google googletest 现在 我的老板对我测试的数据 即我调用被测类的方法的值 在测试中是硬连接的感到不安 他请求从文件中读入
  • 使用 SimpleHTTPServer 进行单元测试

    我正在编写一个 Python 模块 它封装了某个 Web 服务 API 这一切都是 REST 因此实施起来相对简单 然而 在单元测试方面我发现了一个问题 由于我不运行我为其创建此模块的服务 我不想对它们进行锤击 但同时 我需要检索数据来运行
  • ng-invalid-parse 类如何添加到表单中

    我正在使用自定义角度指令来验证表单中的字段 当其中一项验证失败以及自定义错误时 该类ng invalid parse也被添加到该字段中 这是正常行为吗 如果是这样 是什么原因造成的 ng invalid parse当解析器返回未定义时被添加
  • AngularJS $http 错误时 http 状态错误

    我正在尝试使用 AngularJS 的 http 服务构建 JSONP 请求 并且在出现错误时 我收到错误的 http 状态代码 404 而不是 500 并且页面正文也丢失了 所以这是场景 我调用的 URL 返回 500 内部服务器错误 并
  • JUnit、测试和线程

    当我连续运行多个 JUnit 测试时 JUnit 是否为每次执行创建一个新线程 或者所有内容都包装在一个线程中 Thanks 这一切都在一个线程上 您没有说明如何调用测试 但例如 运行 TestSuite 将按顺序运行套件中的所有测试 如果
  • 从 Django Rest Framework 中的令牌获取经过身份验证的用户

    我是 Django 新手 我已经成功使用 DRF 构建了一个小型 API 我的 angular js 客户端发布了用户身份验证详细信息 DRF 返回一个令牌 如下所示 token 9944b09199c62bcf9418ad846dd0e4
  • Angular 2 中的 ag-grid 单元测试

    有人在 Angular 2 中对 ag grid 组件进行过单元测试吗 对我来说 测试用例运行时 this gridOptions api 仍然未定义 很抱歉参加聚会有点晚了 但几天前我一直在寻找这个问题的答案 所以想为最终来到这里的其他人
  • 对于带有名称的表单控件没有值访问器...对于垫选择控件

    我正在做一些单元测试jasmine and karma for an 角6应用程序验证是否形成组字段有效 我在垫子选择控制方面遇到问题 当我运行测试用例时 Karma 向我发出错误消息Error No value accessor for
  • 使用 Angular UI Bootstrap 在动态创建的选项卡上设置活动选项卡

    我有一个动态选项卡集 它从一个以空白开始的数组生成选项卡 当我向数组添加新项目时 它会显示为新选项卡 我希望最后添加的选项卡成为活动选项卡 每次向数组添加项目时我都会设置活动索引 HTML
  • 预计来电次数:>= 1 已接来电次数:0

    我正在学习带有钩子的reactjs表单 现在我想使用jest和enzyme测试提交时的表单 这是我的登录组件 import React from react function Login const email setEmail useSt
  • 角度 ng-messages 仅在 $touched 为 true 时显示

    我并没有做任何太特别的事情 我有一个输入 需要在每次击键时进行验证 如果验证失败 则显示错误 不要等待模糊事件来触发 touched 我以为这是默认情况 但显然不是 我正在使用有角度的材料和有角度的消息 我这样做是为了大写锁定检测 标记
  • 如何使用 ng-pattern 验证 angularJs 中的电子邮件 ID

    我正在尝试使用 ng pattern 指令验证 angularJs 中的电子邮件 id 字段 但我是 AngularJs 的新手 我需要在用户输入错误的电子邮件 ID 后立即显示错误消息 我下面的代码正在尝试解决 帮助我使用 ng patt
  • JavaScript中有字符串池的概念吗?我们可以获取仅引用一个 String 对象的值/键吗?

    我有一个大型 json 映射 其中包含大约 100 万个对象 每个对象包含大约 200 个键值对 例如 key1 val1 key2 val2 key1 val3 key2 val4 正如您所看到的 键在这里被重复 每个键都意味着一个新的
  • Angular.js 性能问题

    性能选项卡上的 Batarang 显示在应用程序的根目录上 Angular 正在调用如下所示的函数 function a var e f i a eval h m hc i 根据 batarang 的说法 它的速度慢得令人痛苦 当我在应用程

随机推荐