如何在角度测试中不复制httpBackend代码?

时间:2014-09-12 06:46:32

标签: angularjs karma-jasmine httpbackend

我有一些服务在加载时调用数据。

所以我的测试失败了,因为我需要在$httpBackend中指定意外调用。

这导致我的测试中出现了大量重复的代码。

我尝试减少重复代码的一部分,我决定添加$rootScope.test标志,如果这个标志在那些服务上,则不加载数据,但我仍需要复制$rootScope.test=true测试。

有没有办法在角度测试中正确地做到这一点?

这是一些代码

   $httpBackend.expectGET('/backend/system/translations/en.json').respond({'angularjs': 'cool'});
   $httpBackend.expectGET('/backend/system/translations/he.json').respond({'angularjs': 'cool'});
   $httpBackend.expectGET('/backend/system/translations/ru.json').respond({'angularjs': 'cool'});
   $httpBackend.expectGET('/backend/system/translations/ar.json').respond({'angularjs': 'cool'});
   $httpBackend.expectGET('/translations/general.json').respond({'angularjs': 'cool'});
    i18n = $filter('i18n');

我拥有的每个指令都有一些翻译支持,每种语言都需要这些语句。

1 个答案:

答案 0 :(得分:1)

只用一个语句以相同的方式处理每个URL,请尝试这样:

$httpBackend.expectGET(function(url){
  return true;
}).respond({'angularjs': 'cool'});

来自documentation expectGET的第一个参数是:

  

HTTP url或接收url的函数,如果是url则返回true   匹配当前的定义。

如果您想定义对翻译网址的回复,请尝试这样:

$httpBackend.expectGET(function(url){
   return url.lastIndexOf("/backend/system/translations/", 0) === 0;
}).respond({'angularjs': 'cool'});

此外,您确定需要使用expectGET()代替whenGET()吗?如果你不关心给定的网址是否被调用,多少次以及以何种顺序而你只是想要定义响应,那么当...方法是要走的时候:

请参阅:"请求期望与后端定义"上述文档页面的一部分。

  

后端定义允许您为您的后端定义假后端   如果发出特定请求,则不会断言的应用程序   不是,如果提出请求,它只返回训练有素的响应。考试   无论是否在测试期间提出请求,都会通过。