Angular 服务测试出了什么问题?

2024-03-31

我有一个调用外部网络服务的服务:

angular.module('myApp.services', [])
.service('autoCmpltDataSvc', function ($http) {
    var innerMatch = function (data) {
        return $.map(data, function (item) {
            return {
                fullName: item.name + (item.adminName1 ? ", " + item.adminName1 : "") + ", " + item.countryName,
                shortName: item.name,
                itemId: item.geonameId
            };
        });
    };

    this.fetchFromGeonamesDb = function (request, response, matcher) {
        $http({
            method: 'jsonp',
            url: 'http://ws.geonames.org/searchJSON?callback=JSON_CALLBACK',
            params: {
                featureClass: "P",
                style: "full",
                maxRows: 12,
                name_startsWith: request.destName
            }
        }).success(function (data, status) {
            console.log(data);
            response($.map(innerMatch(data.geonames), matcher));
        });
    };
});

我正在尝试测试它是否正确形成输出,因此我模拟了对真实 Web 服务的调用。 这是我的单元测试。

describe('Services', function () {

    beforeEach(module('myApp.services'));

    describe('autoCompleteService', function () {
        var $httpBackend, svc;
        var results = [];
        var matcher = function (item) {
            return item;
        };
        var response = function (arr) {
            results = arr;
        };

        beforeEach(inject(function ($injector, autoCmpltDataSvc) {
            svc = autoCmpltDataSvc;
            $httpBackend = $injector.get('$httpBackend');
            $httpBackend.whenJSONP(/searchJSON/).
              respond([
              { name: 'City1', adminName1: 'Region1', countryName: 'Country1', geonameId: 1 },
              { name: 'City2', countryName: 'Country2', geonameId: 2}]);
        }));

        afterEach(function () {
            $httpBackend.verifyNoOutstandingExpectation();
            $httpBackend.verifyNoOutstandingRequest();
        });

        it('should return values', function () {
            $httpBackend.expectJSONP(/searchJSON/);
            svc.fetchFromGeonamesDb({ 'destName': 'fra' }, response, matcher);
            $httpBackend.flush();
            expect(results.length).toBe(2);
        });
    });
});

但测试会产生错误。

         TypeError: Cannot read property 'length' of undefined
            at Function.v.extend.map (C:/Users/kmukhort/Documents/_files/TMate/A
ngularTest/app/lib/jquery-1.8.3.min.js:2:15334)
            at innerMatch (C:/Users/kmukhort/Documents/_files/TMate/AngularTest/
app/js/services.js:8:18)

我认为模拟响应有问题,因为它似乎没有返回数组。 但我不明白为什么它不返回数组。

提前致谢!


由于彼得·培根·达尔文,我的愚蠢错误被发现了。

好的,所以您的成功函数期望您的 http 调用返回一个 具有名为 geonames 的字段的对象,当前您的模拟正在返回 一个直阵列。

也许你应该将你的模拟更改为这个?

> $httpBackend.whenJSONP(/searchJSON/).
>               respond( { geonames: [
>                 { name: 'City1', adminName1: 'Region1', countryName: 'Country1', geonameId: 1 },
>                 { name: 'City2', countryName: 'Country2', geonameId: 2}]
>               });

https://groups.google.com/forum/#!topic/angular/u-fYR-AC8Ec https://groups.google.com/forum/#!topic/angular/u-fYR-AC8Ec

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

Angular 服务测试出了什么问题? 的相关文章

随机推荐

  • 使用 JavaScript 打开另一个 html 页面时传递变量

    这可能是一个非常愚蠢的问题 但我在网上找不到它 而且我已经寻找了至少一个小时 我有一个链接 a href MusicMe html Instruments a 我想在单击后获取它的 ID 因为我需要将一些变量传递到我打开的页面以知道仪器链接
  • 2 个 2D 向量的叉积

    任何人都可以提供一个返回叉积的函数的示例TWO二维向量 我正在尝试实施这个算法 http www blackpawn com texts pointinpoly default html C 代码会很棒 谢谢 EDIT 找到了另一种适用于
  • 查找 NxN 网格中所有路径的算法

    想象一个机器人坐在 NxN 网格的左上角 机器人只能向两个方向移动 向右和向下 机器人有多少种可能的路径 我可以在谷歌上找到这个问题的解决方案 但我对解释不是很清楚 我试图清楚地理解如何解决这个问题并用Java实现的逻辑 任何帮助表示赞赏
  • Android 自定义视图应扩展 AppCompatTextView

    我创建了简单的自定义视图 它扩展自TextView 在 Android Studio 中我收到此警告 This custom view should extend android support v7 widget AppCompatTex
  • 独立移动应用程序上的 WebRTC

    我知道WebRTC是为浏览器设计的 但是可以直接在移动应用程序上使用WebRTC库吗 Thanks 截至5月14日here https github com pchab AndroidRTC是一个android项目 使用WebRTC效果很好
  • 为什么我不能在 kotlin 中使用 lambda 接口? [复制]

    这个问题在这里已经有答案了 看 我有一个 Java 类 public final class JavaReceiveSingle public static void useSingle Single single single doSth
  • 为什么仅当我在 SDL2 中设置非零 Alpha 大小时才获得 sRGB 帧缓冲区?

    我正在尝试通过以下方式以伽玛正确的方式渲染典型的 OpenGL 颜色三角形本指南 https learnopengl com Advanced Lighting Gamma Correction并查阅 SDL2 文档 了解如何在默认帧缓冲区
  • 在类似热图的图中写入值,但对于seaborn中的分类变量

    我在类似热图的图中绘制了一个数据框 我想写入单元格 但不是单元格的值 但我将该值与条件进行比较并告诉它是哪种错误 例如 import pandas as pd import seaborn as sns matplotlib inline
  • 在 Android 模拟器中不使用 -writable-system 时,Hosts 文件中的更改会丢失

    我通过使用标志 writable system 启动模拟器来更新 Android 模拟器中的 system etc hosts 文件 emulator exe avd tablet writable system 当我在没有 writabl
  • Redshift 中“ADD COLUMN IF NOT EXISTS”的解决方法

    我正在尝试通过 Spark Redshift 执行 S3 复制操作 并且希望在运行复制命令之前修改 Redshift 表结构 以便添加任何缺失的列 它们应该都是 VARCHAR 我能做的是在运行副本之前发送一个 SQL 查询 所以理想情况下
  • inputStream 和 utf 8 有时显示“?”人物

    所以我已经处理这个问题一个多月了 我还通过谷歌检查了几乎所有可能的相关解决方案 但我找不到任何真正解决我的情况的东西 我的问题是我正在尝试从网站下载 html 源代码 但在大多数情况下我得到的是某些文本显示一些 其中的字符 很可能是因为该网
  • 定义类型别名

    我发现 Pascal 的一个非常有用的功能是能够命名数据类型 例如 type person record name string age int end var me person you person etc 你能在 C 中做类似的事情吗
  • jQuery Unslide - 触摸不起作用

    我已经解决了这个问题 我发帖只是为了帮助其他人节省一些时间 我正在将 unslider 用于商业网站 这是一个我正在制作的响应式网站 因此向滑块添加触摸支持的功能很有吸引力 不幸的是 正如作者声称的那样 它不能直接开箱即用 UPDATE我使
  • 学习游戏开发,有什么书推荐吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 通过 SSH 执行 sudo 的正确方法是什么?

    我有一个脚本 它通过 SSH 在远程服务器上运行另一个脚本sudo 但是 当我输入密码时 它会显示在终端上 否则它工作正常 ssh user server sudo script 执行此操作的正确方法是什么 以便我可以输入密码sudo通过
  • 使用 Windows 服务手动实现 IoC

    我是 IoC 的新手 因此一直在遵循 Jeffery Palermo 在他的帖子中提供的示例http jeffreypalermo com blog the onion architecture part 1 http jeffreypal
  • SQL:限制链接到每个连接行的行

    我有某些情况需要 MySQL 查询的某些结果集 让我们先看看当前的查询 然后问我的问题 SELECT thread dateline AS tdateline post dateline AS pdateline MIN post date
  • Python 中(大)1554 x 1554 矩阵的行列式

    我需要在 python 中计算单精度的大型 1554 1554 值矩阵的行列式 这样做时我遇到了运行时警告 import numpy as np from numpy import linalg as LA a np random rand
  • 我可以在不使用 npm、VS、Node 等而只使用 JS 代码本身的情况下转换 ES6-ES5 吗?

    我试图让 Firefox 在 ES6 中运行 Promise 但遇到了触发错误的 let 关键字 语法错误 let 是保留标识符 更改脚本标签以包含 类型 应用程序 javascript 版本 1 7 没有用 所以我正在寻求转换代码 我的情
  • Angular 服务测试出了什么问题?

    我有一个调用外部网络服务的服务 angular module myApp services service autoCmpltDataSvc function http var innerMatch function data return