Here I have a function that returns a promise and has a success handler and failure handler. So let’s see how to test such a function:
myFactory.getCallStatus = function() {
MyApi.getData().$promise.then(function(data) {
switch (data.status) {
case 'UPDATED':
myFactory.afterUpdate()
break;
case 'COMPLETED':
myFactory.afterCompleted();
break;
case 'FAILED':
myFactory.afterFailure()
break;
}
});
}
myFactory.afterUpdate=function(){
...
//some code here....
...
}
myFactory.afterCompleted=function(){
...
//some code here....
...
}
myFactory.afterFailure=function(){
...
//some code here....
...
}
To start testing this, create a new file named “myFactory.test.js” and initialize the factory you need to test, which in this case is “MyFactory”.
'use strict';
describe('MyFactory', function () {
var factory, $q, MyApi; // declare variables to hold reference of factory and $q service.
beforeEach(function() {
module('someModule'); // initialized module to which your factory belongs.
module(function ($provide) {
// resolve all required dependencies of factory.
$provide.factory('XYZFactory', function() {});
})
inject(function (_MyFactory_, _$q_, _MyApi_) {
factory = _MyFactory_; // inject factory for which you are writting test cases.
$q = _$q_; // As we need $q service to test function which returns promise.
MyApi=_MyApi_;
});
});
describe('Validate getCallStatus', function () {
var deferred;
var data = {'status':"UPDATED",info:'success'};
//Mocked data to resolve getData() call of MyApi .
it("Validate getCallStatus call has been completed.",function() {
deferred = $q.defer();
spyOn(MyApi, 'getData').and.callFake(function () {
//Here we will don't have mocked our getData() api call and now it returns an object of
//promise and it's not been resolved.
return {$promise:deferred.promise, $resolve:false};
});
// Now we will resolve this promise with our stubbed data.
deferred.resolve(data);
expect(MyApi.getData).toHaveBeenCalled();
expect(factory.afterUpdate).toHaveBeenCalled();
});
});
});
So that’s how we tested promise and it’s resolution. I hope this helps you in your testing.
myFactory.getCallStatus = function() {
MyApi.getData().$promise.then(function(data) {
switch (data.status) {
case 'UPDATED':
myFactory.afterUpdate()
break;
case 'COMPLETED':
myFactory.afterCompleted();
break;
case 'FAILED':
myFactory.afterFailure()
break;
}
});
}
myFactory.afterUpdate=function(){
...
//some code here....
...
}
myFactory.afterCompleted=function(){
...
//some code here....
...
}
myFactory.afterFailure=function(){
...
//some code here....
...
}
To start testing this, create a new file named “myFactory.test.js” and initialize the factory you need to test, which in this case is “MyFactory”.
'use strict';
describe('MyFactory', function () {
var factory, $q, MyApi; // declare variables to hold reference of factory and $q service.
beforeEach(function() {
module('someModule'); // initialized module to which your factory belongs.
module(function ($provide) {
// resolve all required dependencies of factory.
$provide.factory('XYZFactory', function() {});
})
inject(function (_MyFactory_, _$q_, _MyApi_) {
factory = _MyFactory_; // inject factory for which you are writting test cases.
$q = _$q_; // As we need $q service to test function which returns promise.
MyApi=_MyApi_;
});
});
describe('Validate getCallStatus', function () {
var deferred;
var data = {'status':"UPDATED",info:'success'};
//Mocked data to resolve getData() call of MyApi .
it("Validate getCallStatus call has been completed.",function() {
deferred = $q.defer();
spyOn(MyApi, 'getData').and.callFake(function () {
//Here we will don't have mocked our getData() api call and now it returns an object of
//promise and it's not been resolved.
return {$promise:deferred.promise, $resolve:false};
});
// Now we will resolve this promise with our stubbed data.
deferred.resolve(data);
expect(MyApi.getData).toHaveBeenCalled();
expect(factory.afterUpdate).toHaveBeenCalled();
});
});
});
So that’s how we tested promise and it’s resolution. I hope this helps you in your testing.
No comments:
Post a Comment
If you have any doubts or questions, please let us know.