如何测试调用 AJAX 函数而不使用 jasmine 触发它的函数?

2023-12-19

我已经签到了如何使用 Jasmine 验证 jQuery AJAX 事件? https://stackoverflow.com/questions/4662641/how-do-i-verify-jquery-ajax-events-with-jasmine and 如何使用进行 AJAX 调用的函数来测试 Angular 控制器而不模拟 AJAX 调用? https://stackoverflow.com/questions/26487051/how-to-test-an-angular-controller-with-a-function-that-makes-an-ajax-call-withou但由于某种原因,他们不一定会推出适合我的格式。

我的问题是我正在对一个函数进行单元测试,该函数调用触发 AJAX 请求的函数。我想在不触发 AJAX 请求(或停止该请求)的情况下测试外部函数,这样我就不会在数据服务器中收到一堆错误的数据。

这是我的外部函数(它调用包含 AJAX 的函数):

vm.clickSubmit = function () {
    vm.loading = true; // starts the loading spinner
    vm.updateData(); // makes current data current in the data model
    vm.inputData = {    // build the data to be submitted
        ...
    };
    vm.submit(); // calls the AJAX function
};

这是我的 AJAX 函数:

vm.submit = function () {
    var d = $.ajax({
        type: "POST"
        , data: angular.toJson(vm.inputData)
        , url: "http://submit_the_data"
        , contentType: "application/json"
        , xhrFields: { withCredentials: true }
        , crossDomain: true
    })
    .success(function (resp) {
        DataService.ticketNumber = resp; // returns ticket# for the data model
    })
    .error(function (error) {
        DataService.ticketNumber = DataService.submitError;
    });
    d.then(function (d) {
        vm.loading = false; // stops the loading spinner
        DataService.tickets = []; // empty's the array to be filled anew
        $location.path('/submitted'); // success splash html
        $scope.$apply();
    });
};

我已经编写了所有将读取并验证中的值的测试inputData对象,但我不确定如何围绕调用clickSubmit()所以实际上没有任何内容提交到服务器。我在单元测试中已经达到这一点:

'use strict';

describe('Controller: HomeController', function () {
    beforeEach(module('tickets'));
    var controller, scope, $location, DataService;
    var tests = 0;
    beforeEach(inject(function ($rootScope, $controller, _$location_, _DataService_) {
        $location = _$location_;
        DataService = _DataService_;
        scope = $rootScope.$new();
        controller = $controller('HomeController', {
            $scope: scope
        });
    }));
    afterEach(function () {
        tests += 1;
    });
    describe('clickSubmit should verify data and submit new ticket', function () {
        beforeEach(function () {
            jasmine.Ajax.install();
            controller.loading = false;
                ... // inputData fields filled in with test data
        });
        afterEach(function () {
            jasmine.Ajax.uninstall();
        });
        it('should start the spinner when called', function () {
            controller.clickSubmit();
            expect(controller.loading).toBeTruthy();
        });
        // other it('') tests
    });
    it('should have tests', function () {
        expect(tests).toBeGreaterThan(0);
    });
});

那么在加载微调器上的期望之后应该做什么来取消对vm.submit()在实际代码中?

Thanks,

-C§


我建议模拟该调用而不是实际调用它。粒度由您决定,您可以存根 ajax 调用,也可以存根整个提交函数。

以下是如何存根提交函数:

spyOn(controller, 'submit').and.callFake(function() {
    DataService.ticketNumber = somevalue;
});

将该代码放置在实际调用控制器(caller.clickSubmit())之前。

然后,您可以跟进对间谍的期望,例如:

expect(controller.submit).toHaveBeenCalled()

或与间谍相关的任何其他期望。

这是茉莉花文档:http://jasmine.github.io/2.0/introduction.html http://jasmine.github.io/2.0/introduction.html
往下看“间谍”区域。

如果你想模拟 ajax 调用,你将不得不模拟这样的承诺:

spyOn($, 'ajax').and.callFake(function() {
    var deferred = $q.defer();
    deferred.resolve(someResponse);
    return deferred.promise;
});

另外,为了让代码等待 Promise 解析,在进行提交调用后,您需要运行 $scope.$digest() 以便 Angular 可以处理 Promise 解析。然后,您可以检查您对取决于承诺的解决或拒绝的代码的期望。

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

如何测试调用 AJAX 函数而不使用 jasmine 触发它的函数? 的相关文章

随机推荐

  • 提取 Javascript 数字的指数和尾数

    有没有一种相当快速的方法可以从 JavaScript 中的数字中提取指数和尾数 AFAIK 没有办法获取 Javascript 中数字后面的位 这让我觉得我正在研究一个因式分解问题 找到m and n这样2 n m k对于给定的k 由于整数
  • || 到底是什么?意思是?

    return empty neededRole strcasecmp role admin 0 strcasecmp role neededRole 0 到底是什么 在这个声明中是什么意思 有人可以帮我把这个翻译成英文吗 我保证我已经用谷歌
  • 32 位应用程序未更新 64 位注册表项

    C 中提到的路径中的注册表项未更新 string path Software Microsoft Windows NT CurrentVersion Windows RegistryKey myKey Microsoft Win32 Reg
  • 绑定不适用于在 XAML 中创建的 DependencyObject

    我尝试使用自定义类在 XAML 中传递多个 CommandParameters 我创建了一个名为值命令参数继承自依赖对象并有两个依赖属性 我们称它们为Value1 and Value2对于这个例子 应该调用命令并传递该对象的按钮如下所示
  • 核心数据在后台保存对象问题

    简而言之 我想要做的是使用后台队列将从 Web 服务提取的 JSON 对象保存到 Core Data Sqlite3 数据库 保存发生在我通过 GCD 创建的序列化后台队列上 并保存到为该后台队列创建的 NSManagedObjectCon
  • Python:包中的“私有”模块

    我有一个包裹mypack带模块mod a and mod b在里面 我想要包裹本身mod a自由进口 import mypack import mypack mod a 不过 我想保留mod b专供mypack 那是因为它的存在只是为了组织
  • 如何在应用程序中使用 iPhone 铃声

    我想在我的应用程序中使用 iPhone 的铃声 这可能吗 请帮助我解决这一点 Thanks 您无法以编程方式使用或更改可用的铃声 很遗憾地说 苹果公司实在是太保守了
  • 添加 TabBarController 作为视图的子视图

    当我的应用程序启动时 我正在加载启动屏幕 然后我想加载一个TabBarController 它是ViewControllers 但是 我的 TabBarController 窗口无法缩放到屏幕尺寸 底部的 TabBar 的 3 4 可能被切
  • 用Windows Forms数据控件和DataTable实现图库式的显示?

    我有一个datatable看起来像下面这样 Room Cook Waiter BG Image 201 Joe Jim Green png 202 Jack Mary Red png 203 Jet Mark Yellow png 204
  • Google 登录 - “access_token”与“id_token”与“代码”

    在我们的网站中 我们过去在使用 Google Sign In 登录人员时使用 access token 首先 我们将用户重定向到 google 用户将 access token 带给我们 我们验证该令牌以确保该用户是实际的 Google 用
  • 无法让 ActiveMQ 重新发送我的消息

    我有一个用 Java 编写的单线程 ActiveMQ 使用者 我想做的就是从队列中接收 一条消息 尝试将其发送到网络服务 如果成功则确认 它 如果 Web 服务调用失败 我希望消息保留在队列中 并在超时后重新发送 除了重新发送部分之外 它或
  • 离开屏幕保护程序或锁定计算机后程序挂起

    我们的程序运行良好 直到有人锁定计算机或弹出屏幕保护程序 但不是 ctrl alt delete 一旦计算机解锁 屏幕保护程序关闭 应用程序就会停止绘制除标题栏之外的所有内容 并停止响应输入 它显示一个大部分为白色的窗口 无法移动或关闭 应
  • SignalR 来自客户端的多个并发调用

    我希望能够做这样的事情 IHubProxy myHubProxy var t1 Task Run gt myHubProxy Invoke
  • Python 字符串替换错误

    我有一个 python 脚本 它不断返回以下错误 类型错误 replace 至少需要 2 个参数 给定 1 个 我一生都无法弄清楚是什么原因造成的 这是我的代码的一部分 inHandler open inFile2 r outHandler
  • 如何在不关闭连接的情况下更改波特率?

    我想连接到一个连接到初始波特率300的串行端口 COM4 的设备 该设备可以使用命令将其波特率更改为9600 我的Java代码将此命令发送到设备并更改设备的波特率 但我不知道如何在不关闭连接的情况下更改程序中的波特率 当连接关闭时 设备恢复
  • log4net 日志文件名中没有进程 ID

    我试图在日志文件名中包含进程 ID 信息 以便每次重新启动应用程序时都会创建一个新的日志文件 我正在从两个项目登录到同一个文件中 这是我的配置
  • 使用 Maven 测试时 Spring Boot 应用程序不读取 application.properties 文件

    UPDATE 我现在意识到了一些事情 我的application properties文件正在正确加载 因为我通过验证 env正在加载我的数据库属性的路径 感谢戴夫 问题似乎是当我使用 Spring Boot maven 插件运行它时 它无
  • Promise.prototype.finally 的 TypeScript 类型定义

    我正在使用这个 ES6 Promise 兼容的最终实现 称为Promise prototype finally https github com matthew andrews Promise prototype finally在我想要转换
  • 即使按照给定的步骤,mod_wsgi 也会在一个版本中编译并在不同版本中运行

    在查看日志后 当我通过客户端运行 apache 服务器时 我收到错误 我了解到 mod wsgi 在编译期间使用 python 2 6 并使用 python 2 7 运行 经过在互联网上的一些研究后 我按照以下步骤操作 您必须重新编译 mo
  • 如何测试调用 AJAX 函数而不使用 jasmine 触发它的函数?

    我已经签到了如何使用 Jasmine 验证 jQuery AJAX 事件 https stackoverflow com questions 4662641 how do i verify jquery ajax events with j