2014-03-13 93 views
14

我有一个工厂执行get请求,我想测试。不幸的是,业力测试告诉我没有在$ httpBackend中定义的响应。AngularJS茉莉花测试get-request

AngularJs 1.2.14, 茉莉花2.0, 噶0.12.0

这里是我的模块,我想测试:

var appFactory = angular.module('appFactory', []); 

appFactory.factory('boxListService', function($http){ 
    return{ 
     getList: function(){ 
      return $http.get('/boxlist').then(function(result){ 
       return result.data; 
      }); 
     } 
    }; 
}); 

我的测试是这样的:

describe('Module-Test', function() { 

    beforeEach(module('appFactory')); 

    it('should call $http.get in getList', inject(function (boxListService, $httpBackend){ 
     $httpBackend.expectGET('/boxlist'); 
     boxListService.getList(); 
     $httpBackend.flush(); 
     })); 
}); 

消息:

Error: No response defined ! 
at $httpBackend (D:/nodeJS/host/test_app/src/public/js/libs/angular/angular-mock.js:1206:13) 

回答

25

你必须定义预期的响应,以及预期的要求。它将具有以下格式:

$httpBackend.expectGET('/boxlist').respond(HTTP_STATUS_CODE, EXPECTED_RESPONSE); 

HTTP_STATUS_CODE是一个整数。 EXPECTED_RESPONSE是要返回的值(通常是Object Literal)。

可以定义只是其中之一。

ngMock httpBackend文档了解更多信息。

+4

我看了这个大约5次,我才意识到还需要在expectGET上声明响应。我的印象是,whenGET是唯一需要申报的地方。可以肯定地说,我们必须对whenGET和expectGET两者作出回应吗? – binarygiant

1

万一它有助于而且因为它发生在我身上,虽然它不是问题的确切情况。我有以下两行:

$httpBackend.whenGET(myService.serviceURL).respond(myMock); 
$httpBackend.expectGET(myService.serviceURL); 

随着when我想定义如何响应呼叫服务时,用expect我想检查,该方法被调用。

这是行不通的(尽管有时会发生,但我不知道为什么)。我想以某种方式expect是压倒when,因此我得到了

Error: No response defined !

解决的办法是删除when条款并添加respond()expect

$httpBackend.expectGET(myService.serviceURL).respond(myMock); 

我不知道为什么框架的行为的方式。如果有人知道这将是很好的,你在这里解释它来改善答案