Это полностью зависит от того, как организованы различные файлы сценариев, а также от системы в целом. Например, если вы использовали Angular, вы можете внедрять зависимости, когда включаете модуль в другой файл сценария. Существуют инструменты для имитации вещей и «шпионажа» за вызовами функций, такие как Sinon, но это все еще сильно зависит от того, как вы код организован.
Ради аргумента предположим, что два файла выглядят так, и мы проигнорируем шаблон проектирования (хотя вам следует серьезно подумать об этом)...
// File A:
window.greeting = function() {
var world = hello();
return 'hello ' + world;
}
// File B:
window.hello = function() {
// possibly lots of code to determine what to return...
var value = 'foobar';
return value;
}
Функция hello()
могла бы так же легко возвращать любое другое значение в зависимости от состояния системы, пользовательского ввода и т. д. В нашем случае это не так, и мы хотим смоделировать код файла B, чтобы мы не нужно проверить, что он делает, просто возвращает строку. Мы могли бы (и должны) сделать это с помощью надлежащей библиотеки имитации/внедрения зависимостей. Однако просто чтобы дать вам представление о минимальной настройке, которую вы могли бы сделать, и чтобы увидеть общий подход, вот наш QUnit. тестовый файл:
var _hello;
QUnit.module('File A', {
setup: function() {
_hello = window.hello; // hold onto the old value
// now we mock out hello()
window.hello = function() {
window.hello.called++; // track calls to it
return 'world'; // return our static value
}
window.hello.called = 0;
},
teardown: function() {
// put the old one back
window.hello = _hello || window.hello;
}
});
QUnit.test('Ensure greeting is correct', function(assert) {
var result = greeting();
assert.equal(window.hello.called, 1, 'hello should be called only once');
assert.equal(result, 'hello world', 'The greeting call should be "hello world"');
});
И если вы хотите увидеть, как он работает, вот вам jsfiddle. Как я уже сказал, это простой пример, показывающий, как вы могли это сделать, но вам следует обратить внимание на правильную организацию кода (например, модули AMD, require, Angular, Ember и тому подобное) и правильная насмешливая библиотека.
person
Jordan Kasper
schedule
01.11.2014