我正在为所有使用Karma和Jasmine的浏览器编写IndexedDb Angular模块的单元测试。
每个浏览器都给我预期的行为(甚至是IE 10+),除了Safari 8.0。
在单元测试中,我创建了三个对象作为数组添加到数据库中。 dbHandler
是indexedDb处理对象。在使用主键1之前,测试中已存在元素。
var entries = [
{ _id: 1, hello3: "test3" },
{ newObject: true, trueness: false },
{ name: "other object", attributes: ['a', 'b', 'c'] }
];
dbHandler.put(entries).then(function(data){
expect(data.length).toEqual(3);
expect(data[0]).toEqual(1);
expect(data[1]).toEqual(2);
expect(data[2]).toEqual(3);
window.clearInterval(interval);
done();
});
_id
是我存储的主键,因此第一个条目应覆盖现有条目。
IndexedDb处理程序的put
方法如下所示:
IndexedDbHandler.prototype.put = function (data) {
var deferer = $q.defer();
var self = this;
this.connect().then(function(){
// create singleton array with data, if data is no array
if (!(data instanceof Array)) {
data = [data];
}
var addedDataCount = 0;
var dataLength = data.length;
var idList = [];
var transaction = IndexedDbHandler._db.transaction([self._tableName], 'readwrite');
transaction.oncomplete = function() {
deferer.resolve(idList);
};
[...]
var objectStore = transaction.objectStore(self._tableName);
// Add data with _id to the database
for (var i = 0; i < data.length; i++) {
objectStore.put(data[i]).onsuccess = function(e) {
idList.push(e.target.result);
}
}
});
[...]
return deferer.promise;
}
此方法返回一个承诺数组,其中包含已保存商店条目的主键。
在Safari 8.0的每个浏览器中,返回的数组都是[1,2,3]
。 Safari返回[1,1,2]
,完全忽略上一次测试中已设置的ID。
当我从第一个_id
对象中删除entries
时,所有浏览器都会返回相同的值。
这是Safari错误还是我做错了什么?
答案 0 :(得分:0)
所以我知道我不应该在SO上发布一个链接作为答案,并随意投票,但我的时间有点短,并认为实际上帮助你会受到赞赏,即使它不是“SO方式” - http://www.raymondcamden.com/2014/9/25/IndexedDB-on-iOS-8--Broken-Bad。