Тестирование безмоментного нокаута с мокко
Я пытаюсь сделать безгласное тестирование моих моделей с нокаутом. Я намеренно избегаю обращаться с любыми конструкциями ui в своей модели viewmodel и оставляю проводку на html-странице.
Это отлично работает в Jasmine, так как он работает в браузере, но когда я переключаюсь на mocha, я заканчиваю работу с первого взгляда в последнюю строку на нокауте, которая:
}) (окно, документ, навигатор);
Я рассмотрел использование zombiejs, что было бы неплохой альтернативой, но я не вижу хорошей истории о том, как ее использовать не меняя сам источник нокаута.
Любые мысли о том, как подойти к этому?
Ответы
Ответ 1
Это тема в настоящее время и на моем радаре. Я дам свои выводы здесь в надежде, что они могут указать вам в правильном направлении.
Вероятный маршрут, который я попытаюсь сделать первым, будет PhantomJS. Это браузер без браузера WebKit, поэтому он должен иметь превосходные DOM, JSON, HTML5 и CSS селектора (он работает с jQuery и qUnit, например).
Я выбрал это, потому что он используется самим knockout.js, который я обнаружил в репозитории knockout.js, где был файл .travis.yml и этот комментарий:
![enter image description here]()
У меня нет никаких доказательств того, что это сработает, но было приятно использовать его в ядре knockout.js. Я также нашел этот бегун script для нокаута /phantom, который выглядит как отличная точка запуска.
Я также нашел < a href= " "rel=" nofollow noreferrer" > a несколько примеры с использованием Mocha и PhantomJS через node.js, включая этот lib расширяющий grunt, чтобы запустить mocha внутри Phantom, и этот script, показывающий, как запускать mocha внутри PhantomJS. Так что эта часть наверняка, по крайней мере.
Другое решение отмеченное в архивах knockoutjs, заключается в использовании knockout-node и JsDOM, чтобы создать работоспособную DOM, но на первый взгляд это казалось слишком туманным и, вероятно, результатом в реализации собственной тестовой среды.
Существует slidedeck, предлагающий zombie.js будет работать с нокаутом/ node/и т.д. Но я не могу найти ничего, предлагающего убедительные доказательства, поэтому мне тоже не понравился этот маршрут.
Ответ 2
Возможно, это потому, что нокаут изменился (поскольку принятый ответ старый), но сегодня я не считаю, что это необходимо (больше). Вы можете легко протестировать модель просмотра Knockout. Все, что мне нужно было сделать, это установить глобальную переменную ko
в моем тесте:
global.ko = require('../../Website/Scripts/knockout-3.4.0.js');
После этого вы можете запустить свой тест как обычно: создать экземпляр своей модели просмотра, выполнить любые операции над ней и утвердить.
Я написал немного больше об этом, но по сути, это работает для меня:
global.ko = require('../../Website/Scripts/knockout-3.4.0.js');
var MyViewModel = require('../../Website/Scripts/myViewModel.js').MyViewModel;
describe('MyViewModel', function() {
var viewModel;
beforeEach(function(){
viewModel = new MyViewModel();
});
describe('...', function() {
/* And so on */
});
});