热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ImplementingandTestingExtAjaxCallswithPromises

ThisarticleexplorestheprocessofintegratingPromisesintoExtAjaxcallsforamorefunctionalprogrammingapproach,alongwithdetailedstepsontestingtheseasynchronousoperations.

This article delves into the practical application of Promises in Ext Ajax calls, enhancing the traditional callback mechanism with a more modern and functional programming paradigm. The implementation leverages the Bluebird library, renowned for its performance and robust error handling capabilities.

The ExtPromise wrapper simplifies making Ajax calls by encapsulating Ext.Ajax and Ext.data.Connection methods within a Promise framework. This transformation not only streamlines the code but also enhances readability and maintainability.

While developing the ExtPromise wrapper was relatively straightforward, testing posed significant challenges. Initially, attempts were made to utilize the jasmine-ajax library, which had been previously enhanced for testing Ajax calls in ExtJS applications. However, compatibility issues between different versions of Jasmine and unexpected errors led to exploring alternative testing frameworks.

Sinon.js and Mocha emerged as viable solutions. Sinon's useFakeXMLHttpRequest feature allows for mocking server responses, making it easier to simulate network requests during tests. Meanwhile, Mocha's support for asynchronous testing provides a more intuitive and flexible testing environment compared to earlier versions of Jasmine.

Below is a sample BDD-style test suite for the ExtPromise.Ajax functionality:

describe('Ajax calls in promise style', function() {
let xhr, ajax;
beforeEach(function() {
xhr = sinon.useFakeXMLHttpRequest();
xhr.OnCreate= function(request) {
ajax = request;
};
});
afterEach(function() {
xhr.restore();
});
describe('ExtPromise.Ajax', function() {
it('should handle successful responses', function(done) {
ExtPromise.Ajax().request({url: 'foo'})
.then(function(response) {
expect(response.responseText).to.equal('Bar');
done();
})
.catch(done);
ajax.respond(200, { 'Content-Type': 'application/json' }, 'Bar');
});
});
});

In this setup, the beforeEach and afterEach hooks ensure that each test starts with a fresh XMLHttpRequest mock. The done callback is crucial for indicating the completion of asynchronous operations, ensuring that the test framework waits for the promise to resolve or reject before concluding the test.

For handling failures, the test structure can be optimized to avoid redundant calls to done():

it('should handle failure responses', function(done) {
ExtPromise.Ajax().request({url: 'foo', scope: scopeObj})
.then(scopeObj.getName)
.then(function(result) {
expect(result).to.equal('Bar In scope');
}, function(error) {
expect(error.status).to.equal(500);
})
.then(done)
.catch(done);
ajax.respond(500, { 'Content-Type': 'application/json' }, 'Error');
});

This adjustment ensures that the test remains clean and avoids potential pitfalls associated with multiple calls to done().


推荐阅读
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • C/C++ 应用程序的安装与卸载解决方案
    本文介绍了如何使用Inno Setup来创建C/C++应用程序的安装程序,包括自动检测并安装所需的运行库,确保应用能够顺利安装和卸载。 ... [详细]
  • OBS Studio自动化实践:利用脚本批量生成录制场景
    本文探讨了如何利用OBS Studio进行高效录屏,并通过脚本实现场景的自动生成。适合对自动化办公感兴趣的读者。 ... [详细]
  • 一、使用Microsoft.Office.Interop.Excel.DLL需要安装Office代码如下:2publicstaticboolExportExcel(S ... [详细]
  • Gradle 是 Android Studio 中默认的构建工具,了解其基本配置对于开发效率的提升至关重要。本文将详细介绍如何在 Gradle 中定义和使用共享变量,以确保项目的一致性和可维护性。 ... [详细]
  • 【MySQL】frm文件解析
    官网说明:http:dev.mysql.comdocinternalsenfrm-file-format.htmlfrm是MySQL表结构定义文件,通常frm文件是不会损坏的,但是如果 ... [详细]
  • Spring Security基础配置详解
    本文详细介绍了Spring Security的基础配置方法,包括如何搭建Maven多模块工程以及具体的安全配置步骤,帮助开发者更好地理解和应用这一强大的安全框架。 ... [详细]
  • 本文详细介绍了如何在 Ubuntu 14.04 系统上搭建仅使用 CPU 的 Caffe 深度学习框架,包括环境准备、依赖安装及编译过程。 ... [详细]
  • 本文详细介绍了在 Red Hat Linux 系统上安装 GCC 4.4.2 的步骤,包括必要的依赖库的安装及常见问题的解决方法。 ... [详细]
  • 本文详细介绍了在 CentOS 系统中如何创建和管理 SWAP 分区,包括临时创建交换文件、永久性增加交换空间的方法,以及如何手动释放内存缓存。 ... [详细]
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
  • 使用TabActivity实现Android顶部选项卡功能
    本文介绍如何通过继承TabActivity来创建Android应用中的顶部选项卡。通过简单的步骤,您可以轻松地添加多个选项卡,并实现基本的界面切换功能。 ... [详细]
  • Beetl是一款先进的Java模板引擎,以其丰富的功能、直观的语法、卓越的性能和易于维护的特点著称。它不仅适用于高响应需求的大型网站,也适合功能复杂的CMS管理系统,提供了一种全新的模板开发体验。 ... [详细]
  • 如何将955万数据表的17秒SQL查询优化至300毫秒
    本文详细介绍了通过优化SQL查询策略,成功将一张包含955万条记录的财务流水表的查询时间从17秒缩短至300毫秒的方法。文章不仅提供了具体的SQL优化技巧,还深入探讨了背后的数据库原理。 ... [详细]
  • AI炼金术:KNN分类器的构建与应用
    本文介绍了如何使用Python及其相关库(如NumPy、scikit-learn和matplotlib)构建KNN分类器模型。通过详细的数据准备、模型训练及新样本预测的过程,展示KNN算法的实际操作步骤。 ... [详细]
author-avatar
幽默的人生就是悲催基_129
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有