如何对调用 getJSON 的 javascript 函数进行单元测试

2024-03-26

我已经在单元测试中苦苦挣扎了两天,但在异步测试方面我无法实现一些目标。我是单元测试的新手,我不明白为什么这不起作用。

我有一个文件 login.js 调用 $.getJSON(url, data, function) 并返回一个带有登录状态的字符串(“成功”或“失败”)。 对 $.getJSON 的调用使用mockjax 来获取数据(它包装了ajax 调用)。

当使用 jQuery 单击事件从测试网页调用时,登录功能工作正常。 但现在我正在尝试使用 Qunit 和 PhantomJS 运行无头测试。

问题似乎在于测试没有等待 $.getJSON 调用来获取结果(即使使用超时)。 有什么线索吗? 这是代码。

login.js

var login = function(user, pass){
    $.getJSON("loginURL", {"user":user, "pass":pass}, function(response){
       if(response.status === "success"){
           //do something
           return "success";
       } 
       else{
           //do something else
           return "fail";
       } 
    });
};

test.js

test("Test login", function(){
    var user = "user1", pass = "pass1";
    var done = assert.async();
    var result = login(user, pass);
    setTimeout(function(){
    assert.equal(result, "success", "expect login succeded");
    done();
    },1000);
});

在测试结果中我得到:

预期:“成功”

结果:未定义


Your login函数应该是异步的,因为它的结果取决于服务器的响应。

因此,让我们像这样重写该函数:

function login(user, pass, done) {
    $.getJSON(..., function (res) {
        done(res.status == 'success')
    })
}

然后你可以像这样测试(假设是摩卡):

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

如何对调用 getJSON 的 javascript 函数进行单元测试 的相关文章

随机推荐

  • 比较两个通用列表

    你好 我如何比较两个Lists 第一种类型ICollections
  • 从功能区按钮触发报告

    我有几个自定义报告 我希望能够向功能区添加触发它们的按钮 是否可以 如果是这样 任何例子都会很棒 提前致谢 要从功能区按钮运行报告 您需要创建一个 js 文件 其中包含将从按钮调用的函数 你需要 4 样东西 rdlName rdl 文件名
  • OS X 上的 GitHub 客户端提交失败(“无法添加文件...)

    我正在尝试从 Mac OS X Mavericks 计算机上的 GitHub 客户端提交对代码所做的更改 像往常一样 我向我的项目添加了一个新包 这是一个 Laravel 项目 我添加了 Rocketeer 包 我还做了一些配置更改 我收到
  • 如何相对于另一个轴定位图中的轴?

    在 MATLAB 中布置图窗时 输入axis equal确保无论发生什么figure尺寸 即axes永远是正方形 我当前的问题是我想向该图中添加第二个轴 通常 这没有问题 我只想输入axes x1 y1 x2 y2 并且将添加一个新的正方形
  • 在多个 .env 文件之间切换,例如 .env.development 和 node.js

    我想为每种模式 开发 生产等 使用单独的 env 文件 在处理我的 vue js 项目时 我可以使用类似的文件 env development or env production为同一环境键获取不同的值 例如 在 env developme
  • 附加元素后 CSS 过渡不起作用

    我遇到了 CSS 转换问题 在尝试其他操作之前 我想了解问题所在 一个容器中有 3 个盒子和一个 下一步 按钮 目标是让下一个框顶部出现在顶部 并在按下 下一个 按钮时淡入 通过将框附加到容器来将其定位在顶部 以便将其添加为最后一个元素 从
  • 如何使用ClearCase注释子命令?

    我试图找出如何获取代码历史记录报告 在其中获取每个代码行的文件版本 我不需要为每个代码行获取多行 只有一个 annotate 子命令有很多参数 我找不到适合该目的的参数 你知道如何得到它吗 非常感谢 每个代码行的文件版本 这几乎看起来像最后
  • 对于非 OK 响应,使用 IHttpActionResult 返回内容

    对于从 Web API 2 控制器返回 如果响应正常 状态 200 我可以返回响应内容 如下所示 public IHttpActionResult Get string myResult return Ok myResult 如果可能的话
  • Oracle 错误:池连接请求超时

    我将 Oracle12c 与用 C 编写的应用程序一起使用 并使用 Oracle ManagedDataAccess dll 来处理数据库连接 我们的产品在运行多年后偶尔会抛出此异常 Oracle ManagedDataAccess Cli
  • 如何在C++中通过位运算找到素数?

    如何在C 中通过位运算找到素数 我认为做到这一点的方法是不要像我们通常那样将位集视为其数字表示 而是将其视为数字列表 所以位集 1111 代表数字 1 2 3 和 4 现在 如果我们说 1 代表素数 0 代表非素数 我们可以如下制作一个筛子
  • 如何解码非关键ASN1数据?

    是否可以使用 crypto 库来解码字节数组中的任意 ASN1 数据 其中有几个序列和整数 ash h 包含所有以 BufferedTransformation 作为输入的方法 但该类是不同密码和哈希的接口 这似乎与我的简单情况根本无关 我
  • 升级到 Angular 9 后,无法在类型文件中找到变量

    我有一个对外部日志记录组件的引用 在 js 文件中引用 我已在类型文件中定义了该组件 打字 d ts declare var LogglyTracker 我已将我的角度应用程序从版本 8 升级到版本 9 现在当我运行时ng build 我收
  • Django 模板名称冲突[重复]

    这个问题在这里已经有答案了 可能的重复 Django 视图 首先从调用应用程序的目录加载模板 https stackoverflow com questions 3092865 django view load template from
  • R 传单缩放控制选项

    我正在使用传单在 R 中构建地图工具 我想将缩放限制在某个区域 但是setMaxBounds功能似乎没有任何效果 library dplyr library leaflet library tigris ohio map lt leafle
  • 如何在 MongoDB 中组织多对多关系

    我有两个表 集合 用户和组 用户可以是任意数量的组的成员 并且用户也可以是任意数量的组的所有者 在关系数据库中 我可能有第三个表 名为 UserGroups 其中包含 UserID 列 GroupID 列和 IsOwner 列 我正在使用
  • 如何编写一个接受借用或拥有元素的“Vec”的函数?

    在 Rust 中 如何将拥有的对象向量传递给需要借用对象向量的函数 我是创建新向量的唯一选择吗 对于函数签名的最佳实践是什么 在该函数中我关心结构体所包含的泛型的类型 但不关心它是否被借用 示例情况 fn using vec of borr
  • MySQL 事务日志

    我正在开发一个项目 要求我们在 DBMS MySQL 中使用 事务日志 我们已经改用 InnoDB 以便使用事务来满足另一个需求 我想了解什么是交易日志 我已经搜索了一天多了 包括阅读 MySQL 文档 也许我只是没有寻找正确的关键词 我不
  • 在 python 中评估后缀?

    我想编写一个函数来计算作为列表传递的后缀表达式 到目前为止我已经得到 def evalPostfix text s Stack for symbol in text if symbol in 0123456789 s push int sy
  • 设备无法识别 USB 调试上的 AVD 设备

    我的公司推出了由中国公司制造的新Android学习选项卡 我在此选项卡上测试我的应用程序时遇到问题 我可以使用驱动程序升级选项卡的操作系统 但我无法将设备用作 AVD 我从开发者选项中打开了 USB 调试 升级操作系统的驱动程序和将设备用作
  • 如何对调用 getJSON 的 javascript 函数进行单元测试

    我已经在单元测试中苦苦挣扎了两天 但在异步测试方面我无法实现一些目标 我是单元测试的新手 我不明白为什么这不起作用 我有一个文件 login js 调用 getJSON url data function 并返回一个带有登录状态的字符串 成