2013-05-14 3 views
0

Я использую следующий формат для создания плагинов.Ловля ошибок при инициализации плагина wth QUnit

$(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

Вы вызываете утверждение «бросает», передавая результат функции как блок вместо передачи объекта функции, который должен быть вызван, поэтому исключение не попадает.

Вместо:

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 будет вызывать объект функции и управлять excpetions.

Я поставил рабочий пример здесь: http://jsfiddle.net/hhk6u/9/

Дополнительные замечания о плагинов JQuery: примечание в примере, который я изменил первую строку вашего кода плагина от:

$(function() { 

в :

;(function ($) { 

этот способ позволяет плагину автоматически запускаться, и это, как правило, хорошая практика ,

Смежные вопросы