我使用以下格式来创建插件。
$(function () {
function PluginName() {
/* some more code here */
}
$.extend(PluginName.prototype, {
_attachPlugin: function (target, options, value) {
target = $(target);
if (target.hasClass(this.shortenerClass)) {
return;
}
var instance = {
options: $.extend({}, this._defaults)
};
if (typeof instance.options.requiredOption === 'undefined') {
throw 'You need required option!';
}
},
});
var getters = [/* some getters */];
function isNotChained(method, otherArgs) {
if (method === 'option' && (otherArgs.length === 0 ||
(otherArgs.length === 1 && typeof otherArgs[0] === 'string'))) {
return true;
}
return $.inArray(method, getters) > -1;
}
$.fn.pluginname = function (options) {
var args = Array.prototype.slice.call(arguments, 1);
if (isNotChained(options, args)) {
return plugin['_' + options + 'Plugin'].apply(plugin, [this[0]].concat(args));
}
return this.each(function () {
if (typeof options === 'string') {
if (!plugin['_' + options + 'Plugin']) {
throw 'Unknown method: ' + options;
}
plugin['_' + options + 'Plugin'].apply(plugin, [this].concat(args));
} else {
plugin._attachPlugin(this, options || {});
}
});
};
var plugin = $.pluginname = new PluginName();
})(jQuery);
当我传入我的选项对象时,我想确保某个选项存在。如果没有,请从_attachPlugin方法抛出错误。错误被抛出然而我无法让QUnit断言错误被抛出。目前我的测试看起来像这样:
test('Init error', function () {
throws($('#selector').pluginname(), 'Throws error when missing required option.')
});
我认为我可以通过编写测试来测试错误:
test('Init error', function () {
throws($.urlshortener._attachPlugin($('#selector')[0]), 'Throws an error');
});
无论哪种方式我写它,两个测试都死于从_attachPlugin抛出的错误,这是QUnit没有捕获。
答案 0 :(得分:0)
您正在调用“throws”断言,将函数结果作为块传递,而不是传递要调用的函数对象,这就是未捕获异常的原因。
而不是:
test('Init error', function () {
throws($('#selector').pluginname(), 'Throws error when missing required option.')
});
您应该将测试定义为:
test('Init error', function () {
throws(function() { $('#selector').pluginname() }, 'Throws error when missing required option.')
});
这样,QUnit将调用函数对象并管理激活。
我在这里放了一个工作示例:http://jsfiddle.net/hhk6u/9/
有关jQuery插件的其他说明:请注意,示例中我更改了插件代码的第一行:
$(function () {
为:
;(function ($) {
这样可以避免插件自动启动,这通常是一种很好的做法。