1

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

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

所以,情况如下:

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

它看起来像这样:

.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 天了!我绝望了!任何帮助将不胜感激!

请原谅我的英语错误。

问候

4

1 回答 1

2

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

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

  • 你得到了一个你不then-ing的承诺。
  • 您需要get从承诺中调用或在返回的角度资源上进行调用以调用该资源。
  • 您正在将字符串与对象进行比较(我JSON.stringify()为您编辑了对象)。
  • 您需要模拟 HTTP 请求(或开始passThrough()工作 - 我做不到)。

结果如下:

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

于 2013-10-31T16:30:54.973 回答