AngularJS与Jasmine,嵌套服务测试

时间:2013-10-31 12:59:12

标签: unit-testing angularjs jasmine plunker

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

但是,我仍然非常喜欢AngularJS的菜鸟,以便真正掌握更好的方法。我的一些同事告诉我,我可以测试嵌套方法,但似乎不是这样。

所以,情况就是这样:

我有一个服务,它对restfull webservice执行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变量下。无论如何,这是我注入的配置对象的部分:

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

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

    return deferred.promise
}

所以,正如你所看到的,我必须嵌套返回,一个用于config.get方法,来自服务;另一个是GET的返回,它也依赖于$ resource,也注入了我的服务。这个$资源来自角度资源。没有采取任何措施来覆盖它。

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

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

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

我已经在这件事已经4天了!我绝望了!任何帮助将不胜感激!

请原谅我的英语错误。

此致

1 个答案:

答案 0 :(得分:2)

我认为可能有bug阻止您完全按照自己的意愿行事 - 端到端测试。如果您允许HTTP请求一直到第三方URL(即您没有嘲笑他们的回复),那么您就不会进行单元测试。

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

  • 你得到了一份承诺,你不是then
  • 您需要在承诺上调用返回的角度资源上的get或其他内容,以便对资源进行调用。
  • 您正在将字符串与对象进行比较(我JSON.stringify() - 为您编写对象。)
  • 您需要模拟HTTP请求(或让passThrough()工作 - 我无法工作)。

这是结果:

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