我试图弄清楚如何使用karma + jasmine测试服务承诺,但没有成功。到目前为止,这是我对结果错误所做的:
PhantomJS 2.1.1 (Mac OS X 0.0.0) The FetchData service should fetch data FAILED
Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
fetchData服务:
module.exports = function($http) {
return {
getFoo: function(id) {
return $http.get('https://api/' + id)
.then(function(result) {
return result.data;
});
}
}
};
试验:
describe('The FetchData service', function() {
var dataFetcher;
beforeEach(angular.mock.module("myApp"))
beforeEach(inject(function(_dataFetcher_) {
dataFetcher = _dataFetcher_;
}));
it('should fetch data', function(done) {
var testData = function(res) {
expect(res.success).toBe(true);
};
var failTest = function(error) {
expect(error).toBeUndefined();
};
dataFetcher.getFoo(id)
.then(testData)
.catch(failTest);
});
});
我想知道是否有一些我可能会遗漏的东西可以帮助我理解这一点,
谢谢!
答案 0 :(得分:1)
您需要在测试中注入$ httpBackend服务来模拟$ http服务。
然后你需要调用$ httpBackend.flush来模拟实际的HTTP调用。 例如,请检查角度文档。
编辑:
it('should fetch data', function () {
var status, data;
function successCB(response){
status = 'success';
data = response.data;
}
function errorCB(){
status = 'error'
}
//only pass the success and error callbacks here
dataFetcher.get(1).then(successCB, errorCB);
// you need to stop it
$httpBackend.flush();
//assert for success
$httpBackend
.when('GET', 'https://api/1')
.respond(200, {foo:'bar'});
expect(status).toEqual('success');
expect(data).toEqual({foo: 'bar'});
//assert for error
$httpBackend
.when('GET', 'https://api/1')
.respond(500, 'An error has occured.');
expect(status).toEqual('success');
});
答案 1 :(得分:0)
这是我迄今为止得到的解决方案,基于实际的Angularjs文档。
我希望它不言自明(更新基于@mehndra的回答和提示):
describe('The FetchData service', function() {
var dataFetcher, $httpBackend;
beforeEach(angular.mock.module("myApp"));
beforeEach(inject(function(_dataFetcher_, _$httpBackend_) {
dataFetcher = _dataFetcher_;
$httpBackend = _$httpBackend_;
}));
afterEach(function() {
$httpBackend.verifyNoOutstandingExpectation();
$httpBackend.verifyNoOutstandingRequest();
});
it('should fetch data', function () {
var status, data,
pid = 2140,
api = 'https://api';
function successHandler(res){
status = 'success';
data = res.data;
expect(res.success).toEqual(true);
expect(status).toEqual('success');
}
function errorHandler(){
status = 'error'
}
$httpBackend
.when('GET', api + '/' + pid)
.respond({ success: true });
$httpBackend
.when('GET', api + '/' + pid)
.respond(500, 'An error has occured.');
dataFetcher.get(pid).then(successHandler, errorHandler);
$httpBackend.flush();
});
});