【问题标题】:AngularJS with Jasmime, nested services testAngularJS 与 Jasmime,嵌套服务测试
【发布时间】:2013-11-01 00:30:54
【问题描述】:

在阅读了这么多关于使用 Jasmine 进行 AngularJS 测试的帖子后,我得出的结论是,我构建服务的方式不是可测试的。

但是,我仍然是 AngularJS 的菜鸟,无法真正掌握更好的方法。我的一些同事告诉我,我可以测试嵌套方法,但似乎并非如此。

所以,情况如下:

我有一个服务,它对一个完整的 web 服务执行 GET 并返回一个对象。

看起来像这样:

.factory('MyService', function( $resource, config, $q ) {
    return config.get("RestServiceBaseUrl").then(function(baseUrl) {
        return $resource(baseUrl+"params_necessary_to_my_rest_call")
    })
 })

它注入了该配置,这也是一项服务,它将返回我在物理配置文件中的任何内容,在这种情况下,它是一个 url,存储在 RestServiceBaseUrl JSon 变量下。无论如何,这是我注入的配置对象的 get 部分:

function get(sKey) {
    var deferred = $q.defer()

    ConfigGet(sKey, function (resp) {
        deferred.resolve(resp['result'])
    })

    return deferred.promise
}

所以,如您所见,我必须嵌套返回,一个用于 config.get 方法,它来自服务;另一个是 GET 的返回,它也依赖于 $resource,也注入到我的服务中。该 $resource 来自角度资源。没有做任何事情来覆盖它。

在我的单元测试中,我尝试了很多方法来实现测试,但令人沮丧,因为当我通过配置问题时,我遇到了 $resource 问题,而且我似乎无法正确执行归结为使用注入服务测试服务。

这是我在 Plunker 的代码:http://plnkr.co/edit/RSFTKq

如您所见,我正在尝试从我的服务中测试返回值。

我已经用了 4 天了!我绝望了!任何帮助将不胜感激!

请原谅我的英语错误。

问候

【问题讨论】:

    标签: unit-testing angularjs jasmine plunker


    【解决方案1】:

    我认为可能有一个bug 阻止您做您想做的事情 - 端到端测试。如果您允许您的 HTTP 请求一直到达第三方 URL(即您没有模拟他们的回复),那么您就没有进行单元测试。

    这是一个端到端测试的工作示例,将调用保存到 twitter 本身(因为我提到的问题)。基本上这是您的测试代码的问题:

    • 你收到了一个你不是then-ing的承诺。
    • 您需要调用 get 或对从 promise 返回的 Angular 资源进行调用以调用该资源。
    • 您将字符串与对象进行比较(我JSON.stringify()-为您编辑了对象)。
    • 您需要模拟 HTTP 请求(或者让 passThrough() 工作 - 我做不到)。

    结果如下:

    http://plnkr.co/edit/8WIPmm?p=preview

    【讨论】:

    • 谢谢贾里德!它就像一个魅力!我不知道整个嘲笑回复过程!现在一切正常,感谢您!
    • 我很高兴!我看到你已经被困了好几天,所以我想我会伸出援手:) 如果它回答了你的问题,别忘了投票并接受它作为正确答案!
    • Jared,我肯定会赞成你的回答,不幸的是,我在这个 stackoverflow 中是如此的菜鸟,它不会让我这样做,除非我有一定的声誉。一旦我有这样的声誉,我肯定会支持你的回答。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    相关资源
    最近更新 更多