gpt4 book ai didi

javascript - Jasmine spyOn 使用伪造的返回数组测试功能

转载 作者:行者123 更新时间:2023-11-29 21:52:19 27 4
gpt4 key购买 nike

我试图用 Jasmine 测试的函数获取一个对象数组,然后使用 splice() 方法根据函数传递的参数对其重新排序。

我知道我使用 spyOn().and.returnValue() 伪造返回数组。但是我如何使用那个假返回来测试函数的重新排序功能呢?特别是如何在规范中引用伪造的返回?

注意:重新排序后,会调用其他函数。我想在重新排序继续之前捕获重新排序的结果。

function templates($rootScope, $q) {
return {
reorder: function(item, fromIndex, toIndex) {
var storeDeferred = $q.defer();
$rootScope.store.templates.all(function(templates) {
if (templates) {
// Reorder templates
templates.splice(fromIndex, 1);
templates.splice(toIndex, 0, item);
// Nuke then insert back reordered
this.nuke(function() {
this.batch(templates, function(templates) {
storeDeferred.resolve(templates);
});
});
} else {
storeDeferred.reject('templates not found');
}
});
return storeDeferred.promise;
}
}
}

测试

describe('Unit: templates', function() {
beforeEach(function() {
module('app');
inject(function($injector) {...}); // inject Templates and $rootScope
});

describe('Templates.reorder', function() {
it('should move object at index 2 to the start', function() {
spyOn(rootScope.store.templates, 'all').and.returnValue([{a: 1}, {a: 2}, {a:3}]);
Templates.reorder({a:3}, 2, 0);
expect(REFERENCE_THE_FAKE_RETURN).toBe([{a:3}, {a: 1}, {a: 2}]);
});
});
});

最佳答案

您需要设置 all 函数以接受回调,然后使用您需要测试的数组调用回调。然后,您需要使用一个变量来存储传递到返回的 promise 中的模板。之后您需要调用 $digest(),然后您可以使用 angular.equals 比较这些值。为了模拟 this 进行单元测试,您可以使用 bind 函数将 this 设置为模拟。

describe('Templates.reorder', function() {
it('should move object at index 2 to the start', function() {
var templatesFromPromise;
rootScope.store = {
templates: {
all: function(callback) {
var thisMock = {
nuke: function (nukeCallback) {
var nukeCallbackBound = nukeCallback.bind(thisMock);

nukeCallbackBound();
},
batch: function (data, batchCallback) {
batchCallback(data);
}
};

var callbackBound = callback.bind(thisMock);

callbackBound([{a: 1}, {a: 2}, {a: 3}]);
}
}
};

spyOn(rootScope.store.templates, 'all').and.callThrough();
Templates.reorder({a:3}, 2, 0).then(function (data) {
templatesFromPromise = data;
});

rootScope.$digest();

expect(angular.equals(templatesFromPromise, [{a:3}, {a: 1}, {a: 2}])).toBe(true);
});
});

Plunkr

关于javascript - Jasmine spyOn 使用伪造的返回数组测试功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28500161/

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