Я экспериментировал с тестами QUnit и искал хороший метод для переопределения функций с помощью имитаций, чтобы включить больше атомарных тестов.Существуют хорошие решения для конкретных случаев, например, переопределение $ .ajax ( Simple jQuery (1.5+) AJAX Mocking ), но я искал более общий подход и придумал следующее:
// Constructor for overrides.
function overrides(overrides) {
this.overrides = overrides;
}
// Implementation for overrides.
overrides.prototype = {
set: function () {
var functions = {};
$.each(this.overrides, function (key, value) {
eval("functions['" + key + "'] = " + key + ";");
eval(key + " = value;");
});
this.functions = functions;
},
reset: function () {
var functions = this.functions;
$.each(this.overrides, function (key, _) {
eval(key + " = functions['" + key + "'];");
});
}
}
Что может быть использовано следующим образом:
module("Comments", {
setup: function () {
this.overrides = new overrides({ "$.ajax": function (url, options) {
alert("ajax: " + url + ', ' + options);
}
});
this.overrides.set();
},
teardown: function () {
this.overrides.reset();
}
});
Теперь, когда все работает нормально, и хотя это может быть не самое худшее использование eval (), мне было интересноесли это действительно может быть написано без использования eval ()?Я прочитал несколько других вопросов о eval () и попробовал различные варианты, такие как доступ к переопределениям с помощью window [], но это не работает, например, для случая $ .ajax (window ['$']. Ajaxработает, но не window ['$. ajax']).
Возможно, я также думаю о том, что hard и eval () можно использовать здесь безопасно, или в целом есть лучший подход для переопределений функций?