After some struggle, I successfully have jasmine tests running using karma, but I can't seem to find an answer to this question:
I am using this: https://github.com/couchbaselabs/ng-couchbase-lite
This is my test:
describe('SetupService tests', function() {
it('SetupService should instantiate', function() {
expect(SetupService).toBeDefined();
});
it('it should instantiate database', function() {
var database = null;
SetupService.setupConfig();
expect(database).not.toBeNull();
});
});
So I need to run the tests on an actual device so the db can successfully be created. I am new to unit testing and currently only using karam cli.
The setup config showing that it requires couchbase lite and cordova:
var setupConfig = function() {
console.log("set up config");
var deferred = $q.defer();
if(!window.cblite) {
deferred.reject('Couchbase Lite not installed');
}
else {
cblite.getURL(function(err, url) {
console.log("cblite get url");
if(err) {
console.log(err);
deferred.reject("There was an error getting the database URL");
}
else{
database = new $couchbase(url, appDbName);
database.createDatabase().then(function(result) {
var views = setupViews();
database.createDesignDocument("_design/todo", views);
database.listen();
deferred.resolve(true);
}, function(error) {
// we will not reject this err, as it is caused when a db already exists
// so it will happen everytime
deferred.resolve(err);
});
}
});
}
return deferred.promise;
};
Create a folder called tests
in www/
.
Download latest standalone jasmine zip from Here
a. Put the lib
folder in www/tests
b. Copy SpecRunner.html
to www/
.
SpecRunner.html
look exactly like your index.html
.
Then add jasmine css and scripts to SpecRunner.html
just before </head>
<link rel="shortcut icon" type="image/png" href="tests/lib/jasmine-xxx/jasmine_favicon.png"> <link rel="stylesheet" href="tests/lib/jasmine-xxx/jasmine.css"> <style> .jasmine_html-reporter{ width: 100%; margin: 200px 0px; } </style>
At the end of the body
tag, add jasmine lib scripts:
<script src="tests/lib/jasmine-xxx/jasmine.js"></script> <script src="tests/lib/jasmine-xxx/jasmine-html.js"></script> <script src="tests/lib/jasmine-xxx/boot.js"></script>
.
Open boot.js
in www/tests/lib/jasmine-xxx/boot.js
Look for the window.load
function and replace with this:
window.onload = function() { if (currentWindowOnload) { currentWindowOnload(); } jasmine.initialize = htmlReporter.initialize; jasmine.execute = env.execute; };
.
In the ctrl of you starting page, add this when everything has loaded:
if(window.jasmine){ console.log("---------------------------------------------------------"); console.log("STARTING JASMINE..."); jasmine.initialize(); jasmine.execute(); console.log("---------------------------------------------------------"); console.log("JASMINE INITIALED"); console.log("---------------------------------------------------------"); }
I personally bootstrap angular manually, so I start jasmine after angular is bootstrapped and my main Ctrl is loaded:
window.ionic.Platform.ready(function() { console.log("device ready"); angular.element(document).ready(function() { angular.bootstrap(document, ['myApp']); }); });
Then in my Ctrl after I've loaded a document from Couchbase, I start jasmine.
.
Finally to Run Tests:
rename index.html
to index_backup.html
rename SpecRunner.html
to index.html
and run ionic run android --device
.
Automate Step 8 using Makefile:
set-test: @if [ -f "www/SpecRunner.html" ]; \\ then \\ mv www/index.html www/index_backup.html; \\ mv www/SpecRunner.html www/index.html; \\ else \\ echo "test already set"; \\ fi unset-test: @if [ -f "www/SpecRunner.html" ]; \\ then \\ echo "test already unset"; \\ else \\ mv www/index.html www/SpecRunner.html; \\ mv www/index_backup.html www/index.html; \\ fi test: make set-test ionic run android --device
Sample Test
describe('AccountsCtrl', function() { var $scope; var app; var $ionicSideMenu; var helper; var params = { name : 'Test Person', id: '112654' }; beforeAll(function(done){ app = AppService; helper = getService("ActivitiesHelper"); $state.go('app.activities',params); // wait for the state to change setTimeout(function(){ $scope = getScope("activities"); done(); },1000) }); it('expects $scope.app to be defined', function() { expect($scope.app).toBeDefined(); }); });
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.