2016-06-28 61 views
0

我正在嘗試使用茉莉花和業力編寫角度服務的測試。我有以下代碼爲我服務電話:角度服務測試無法返回所需的響應

angular.module('omdb', []) 
 
    .factory('myservice', MyService); 
 
MyService.$inject = ['$http']; 
 

 
function MyService($http) { 
 
    var vm = this; 
 
    var service = {}; 
 
    service.getData = function() { 
 
    return $http.get('omdb/mydata.json').then(function(response) { 
 
     return response.data; 
 
    }); 
 
    }; 
 
    return service; 
 
};

我tesitng它使用下列文件規範爲:

describe('myservice', function() { 
 
    var mockservicedata = [{ 
 
    "name": "value1", 
 
    "id": "1" 
 
    }, { 
 
    "name": "value2", 
 
    "id": "2" 
 
    }, { 
 
    "name": "value3", 
 
    "id": "3" 
 
    }]; 
 

 
    var myservice = {}; 
 
    beforeEach(module('omdb')); 
 
    beforeEach(inject(function(_myservice_) { 
 
    myservice = _myservice_; 
 
    })); 
 

 
    it('should return search myservice data', function() { 
 
    expect(myservice.getData()).toEqual(mockservicedata); 
 
    }); 
 
});

基本上拋出錯誤爲:

Expected d({ $$state: Object({ status: 0 }) }) to equal [ Object({ name: 'value1', id: '1' }), Object({ name: 'value2', id: '2' }), Object({ name: 'value3', id: '3' }) ]. 

[email protected]://localhost:59239/movie-app/lib/jasmine-2.3.4/jasmine.js:1482:17 
[email protected]://localhost:59239/movie-app/lib/jasmine-2.3.4/jasmine.js:1452:14 
Env/[email protected]://localhost:59239/movie-app/lib/jasmine-2.3.4/jasmine.js:583:18  
[email protected]://localhost:59239/movie-app/lib/jasmine-2.3.4/jasmine.js:324:29 [email protected]://localhost:59239/movie-app/lib/jasmine-2.3.4/jasmine.js:533:16 
Expectation.prototype.wrapCompare/<@http://localhost:59239/movie-app/lib/jasmine-2.3.4/jasmine.js:1406:7 
@http://localhost:59239/movie-app/spec/omdb/myservice.spec.js:14:9 
[email protected]://localhost:59239/movie-app/lib/jasmine-2.3.4/jasmine.js:1789:9 
[email protected]://localhost:59239/movie-app/lib/jasmine-2.3.4/jasmine.js:1777:9 [email protected]://localhost:59239/movie-app/lib/jasmine-2.3.4/jasmine.js:1762:5 
Env/[email protected]://localhost:59239/movie-app/lib/jasmine-2.3.4/jasmine.js:627:7 
[email protected]://localhost:59239/movie-app/lib/jasmine-2.3.4/jasmine.js:353:5 executeNode/<[email protected]://localhost:59239/movie-app/lib/jasmine-2.3.4/jasmine.js:2360:32 [email protected]://localhost:59239/movie-app/lib/jasmine-2.3.4/jasmine.js:1819:9 
[email protected]://localhost:59239/movie-app/lib/jasmine-2.3.4/jasmine.js:1774:9 
[email protected]://localhost:59239/movie-app/lib/jasmine-2.3.4/jasmine.js:1762:5 
Env/[email protected]://localhost:59239/movie-app/lib/jasmine-2.3.4/jasmine.js:627:7 
executeNode/<[email protected]://localhost:59239/movie-app/lib/jasmine-2.3.4/jasmine.js:2345:13 [email protected]://localhost:59239/movie-app/lib/jasmine-2.3.4/jasmine.js:1819:9 
[email protected]://localhost:59239/movie-app/lib/jasmine-2.3.4/jasmine.js:1774:9 
[email protected]://localhost:59239/movie-app/lib/jasmine-2.3.4/jasmine.js:1762:5 
Env/[email protected]://localhost:59239/movie-app/lib/jasmine-2.3.4/jasmine.js:627:7 
TreeProcessor/[email protected]://localhost:59239/movie-app/lib/jasmine-2.3.4/jasmine.js:2209:7 
Env/[email protected]://localhost:59239/movie-app/lib/jasmine-2.3.4/jasmine.js:678:7 
[email protected]://localhost:59239/movie-app/lib/jasmine-2.3.4/boot.js:110:5 

我不明白爲什麼它不返回數據到測試。請幫助

回答

1

調用myservice.getData()實際上並不會給您所期望的數據。

由於您從MyServicegetData方法依賴於$httpget方法,你應該嘲笑它,然後期待這些數據返回。

所以,你的測試用例應該是這樣的:

describe('myservice', function() { 
 
    var mockservicedata = [{ 
 
    "name": "value1", 
 
    "id": "1" 
 
    }, { 
 
    "name": "value2", 
 
    "id": "2" 
 
    }, { 
 
    "name": "value3", 
 
    "id": "3" 
 
    }]; 
 

 
    var myservice = {}; 
 
    beforeEach(module('omdb')); 
 
    beforeEach(inject(function(_myservice_, _$httpBackend_) { 
 
    myservice = _myservice_; 
 
    $httpBackend = _$httpBackend_; 
 

 
    $httpBackend.when('GET', "omdb/mydata.json").respond({ 
 
     status: 200, 
 
     data: mockservicedata 
 
    }); 
 
    })); 
 

 
    it('should return search myservice data', function() { 
 
    var response = myservice.getData() 
 
    response.then(function(response) { 
 
     expect(response.data).toEqual(mockservicedata); 
 
    }); 
 
    $httpBackend.flush(); 
 
    }); 
 
});

希望這有助於。

+0

我試圖運行。它給了我一個 'ReferenceError:$ httpBackend未在http:// localhost:59239/movie-app/spec/omdb/myservice.spec.js(第14行)中定義' 如何將其添加到我的規範中。我是否需要包含另一個運行測試的文件 – manu

+0

抱歉,我忘記添加有關從響應中獲取值的部分。謝謝您的幫助 – manu

0

getData()永遠不會返回數據,而是返回promise對象。 如果你想測試它,首先你必須嘲笑服務的數據,然後你可以調用它並匹配成功處理程序中的結果。

代碼如下附:

describe('myservice', function() { 
    var mockservicedata = [{ 
    "name": "value1", 
    "id": "1" 
    }, { 
    "name": "value2", 
    "id": "2" 
    }, { 
    "name": "value3", 
    "id": "3" 
    }]; 

    var myservice, httpBackend; 
    beforeEach(module('omdb')); 
    beforeEach(inject(function(_myservice_, $httpBackend) { 
    myservice = _myservice_; 
    httpBackend = $httpBackend; 
    })); 

    it('should return search myservice data', function() { 
    httpBackend.when("GET", "omdb/mydata.json").respond(mockservicedata); 

    var promise = myservice.getData(); 
    promise.then(function(response) { 
     expect(response.data).toEqual(mockservicedata); 
    }); 
    httpBackend.flush(); 
    }); 
});