Search code examples
javascriptangularjsunit-testingkarma-jasmineweb-sql

AngularJS - WebSQL - Tests in Karma with Jasmine on object returning multiple promises


I got some unit tests to do about a service I'm using (angular-websql) and I got an itchy problem.

This service - $webSql - will create a database which is an object with multiple functions :

$scope.db = $webSql.openDatabase('lastUser', '1.0', 'Data storage of last connected user', 2 * 1024 * 1024);
$scope.db.select(tableName, whereClause).then(function (result) {...});
$scope.db.insert(tableName, whereClause).then(function (result) {...});
$scope.db.update(tableName, whereClause).then(function (result) {...});
$scope.db.del(tableName, whereClause).then(function (result) {...});

And so on...

In my unit test, I mocked the service as followed :

 mock$webSql = {
  openDatabase: function () {
    return {
      createTable: function () {
        var d = _$q_.defer();
        d.resolve();
        return d.promise;
      },
      insert: function () {
        var d = _$q_.defer();
        d.resolve();
        return d.promise;
      },
      del: function () {
        var d = _$q_.defer();
        d.resolve();
        return d.promise;
      },
      update: function () {
        var d = _$q_.defer();
        d.resolve();
        return d.promise;
      },
      select: function () {
        var d = _$q_.defer();
        d.resolve();
        return d.promise;
      }
    };
  }
};

The problem is that I'm evaluating my promise's result in my controller, for example, I'm testing the result after the select function to see if I have a row in my table. So, I'm using some stuff like result.rows.length but I don't know how to test it with Jasmine.


Solution

  • Done. I just had to put in the d.resolve() an object matching the structure of the tested result object, Ie.

    |
    |
    select: function () {
        var d = _$q_.defer();
        d.resolve({row : [] });
        return d.promise;
    }
    |
    |