Тестирование безмоментного нокаута с мокко

Я пытаюсь сделать безгласное тестирование моих моделей с нокаутом. Я намеренно избегаю обращаться с любыми конструкциями 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 */
    });
});