gpt4 book ai didi

angularjs 单元测试基于 promise 的服务(SQlite 数据库服务)

转载 作者:行者123 更新时间:2023-12-01 13:48:38 25 4
gpt4 key购买 nike

我是单元测试 angularjs 应用程序的新手,我想我不明白在 angularjs 上测试基于 promise 的服务的主要概念。

我将直接从我的示例开始:

我有一个 SQLite db-service,它有这个方法:

var executeQuery = function(db,query,values,logMessage) {
return $cordovaSQLite.execute(db, query, values).then(function(res) {
if(res.rows.length>0) return res;
else return true;
}, function (err) {
return false;
});
};

我想编写一个测试用例,在其中执行一个查询,然后我想获取我的服务的 executeQuery 函数的返回值。

我的测试描述是这样的:
describe("Test DatabaseCreateService‚", function () {
var DatabaseCreateService,cordovaSQLite,ionicPlatform,rootScope,q;
var db=null;

beforeEach(module("starter.services"));
beforeEach(module("ngCordova"));
beforeEach(module("ionic"));

beforeEach(inject(function (_DatabaseCreateService_, $cordovaSQLite,$ionicPlatform,$rootScope,$q) {
DatabaseCreateService = _DatabaseCreateService_;
cordovaSQLite = $cordovaSQLite;
ionicPlatform = $ionicPlatform;
q = $q;
rootScope = $rootScope;

ionicPlatform.ready(function() {
db = window.openDatabase("cgClientDB-Test.db", '1', 'my', 1024 * 1024 * 100);
});
}));

describe("Test DatabaseCreateService:createTableLocalValues", function() {

it("should check that the createTableLocalValues was called correctly and return correct data", function() {
var deferred = q.defer();

deferred.resolve(true);

spyOn(DatabaseCreateService,'createTableLocalValues').and.returnValue(deferred.promise);

var promise = DatabaseCreateService.createTableLocalValues(db);
expect(DatabaseCreateService.createTableLocalValues).toHaveBeenCalled();
expect(DatabaseCreateService.createTableLocalValues).toHaveBeenCalledWith(db);
expect(DatabaseCreateService.createTableLocalValues.calls.count()).toEqual(1);

promise.then(function(resp) {
expect(resp).not.toBe(undefined);
expect(resp).toBe(true);
},function(err) {
expect(err).not.toBe(true);
});

rootScope.$apply();
});
});
});

此测试描述有效,但它不从函数返回值,而是返回在 deferred.resolve(true); 中解析的内容

我想要做的是调用 DatabaseCreateService.createTableLocalValues 函数并解析从函数返回的数据。

createTableLocalValues 函数是这样的:
var createTableLocalValues = function(db) {
var query = "CREATE TABLE IF NOT EXISTS `local_values` (" +
"`Key` TEXT PRIMARY KEY NOT NULL," +
"`Value` TEXT );";

return executeQuery(db,query,[],"Create cg_local_values");
};

好吧,如果我在浏览器或设备上运行此方法,如果一切正常并且表被创建,我会得到真正的返回。那么我如何在测试描述中也得到这个真实的,而不是像我上面的例子中那样的假真实呢?

感谢您提供任何帮助。

示例 2(使用 callThrough):
describe('my fancy thing', function () {

beforeEach(function() {
spyOn(DatabaseCreateService,'createTableSettings').and.callThrough();
});

it('should be extra fancy', function (done) {
var promise = DatabaseCreateService.createTableSettings(db);
rootScope.$digest();

promise.then(function(resp) {
console.log(resp);
expect(resp).toBeDefined();
expect(resp).toBe(true);
done();
},function(err) {
done();
});
});
});

在 karma-runner 中记录消息:
LOG: true
Chrome 46.0.2490 (Mac OS X 10.11.1) Test DatabaseCreateService‚ testing createTable functions: my fancy thing should be extra fancy FAILED
Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.

Chrome 46.0.2490(Mac OS X 10.11.1):执行 42 次,共 42 次(1 次失败)(8.453 秒/8.03 秒)

更新:

事实证明,这个问题与 $cordovaSQLite.executeQuery 函数本身有关。不知何故,它没有超时,这就是错误的原因。我把 ng-cordova 的执行功能改成了这个。 (希望此更改不会破坏任何工作)
  execute: function (db, query, binding) {
var q = Q.defer();
db.transaction(function (tx) {
tx.executeSql(query, binding, function (tx, result) {
q.resolve(result);
},
function (transaction, error) {
q.reject(error);
});
});
return q.promise.timeout( 5000, "The execute request took too long to respond." );
}

通过该更改,测试可以正确通过!

最佳答案

你可以监视一个函数,并委托(delegate)给实际的实现,使用

spyOn(DatabaseCreateService,'createTableLocalValues').and.callThrough();

您可能还需要调用 rootScope.$digest()在你调用你的函数之后,promise 就会解决。

编辑:

测试异步代码时,您应该使用 done图案:
it('should be extra fancy', function (done) {
var promise = DatabaseCreateService.createTableSettings(db);
rootScope.$digest();

promise.then(function(resp) {
console.log(resp);
expect(resp).toBeDefined();
expect(resp).toBe(false);
expect(resp).toBe(true);
done();
});
});

关于angularjs 单元测试基于 promise 的服务(SQlite 数据库服务),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33757882/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com