在阅读了使用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天了!我绝望了!任何帮助将不胜感激!
请原谅我的英语错误。
此致
答案 0 :(得分:2)
我认为可能有bug阻止您完全按照自己的意愿行事 - 端到端测试。如果您允许HTTP请求一直到第三方URL(即您没有嘲笑他们的回复),那么您就不会进行单元测试。
这是一个端到端测试的工作示例,将调用保存到twitter本身(因为我提到的问题)。基本上这是您的测试代码的问题:
then
。 get
或其他内容,以便对资源进行调用。JSON.stringify()
- 为您编写对象。)passThrough()
工作 - 我无法工作)。这是结果: