Я часто слышал, как разработчики говорят, что тестовый код должен быть «уродливым» и простым, насколько это возможно.Реализация логики в модульных тестах, чтобы сделать синтаксис более коротким и тестовый код более повторно использоваться
Причина в том, что любая логика в тесте должна быть проверена сама по себе, и это создает парадокс курицы и яйца.
Я обнаружил, что делает свой тест гораздо более читаемым, структурированным и тестовым кодом, гораздо более многоразовым, используя некоторую простую логику.
Вопрос в том, являются ли действующими модульными тестами?
Я использую карму в качестве тестового бегуна, этот конкретный проект использует узел-сервер с диспетчером подключений-активов и пакеты-адаптеры для передней панели.
Как сделать код более модульным (AMD? Browsify?), Без необходимости реализовывать все с нуля или внедрять фреймворк.
В настоящее время глобальное состояние изменено во многих файлах, и много закрытий мне не нравится. Как я могу сделать код в закрытии еще проверяемым? this package возможно?
Пример кода:
utils.js
function getRealTemplatValues (inputs, templateFn, outerId, innerClass) {
var i, res;
for (i = 0; i < inputs.length; i++) {
res = templateFn(inputs[i]);
$('#' + outerId).append(res);
}
return $('.' + innerClass).map(function(){
return $(this).html();
}).get();
};
function assertEqual (done, expect, inputs, outputs, fn, decorator) {
function iter (input, output, cb) {
var i;
for (i = 0; i < inputs.length; i++) {
cb(input[i], output[i]);
}
};
function cb (input, output) {
output = !!decorator ? decorator(output) : output;
expect(fn(input, decorator)).toBe(output);
done && done();
}
iter(inputs, outputs, cb, decorator);
};
helper.scenario.js
describe('helpers', function() {
var inputs = ["#string#string#string", "string#string", "string#string#string#", "#", "###"],
outputs = ["#string #string #string", "string #string", "string #string #string#", "#", "###"],
decorString = 'magic!',
outerId = "container",
innerClass = "inner",
decorator = function(input) {return input + decorString};
describe('breakHashtags - unit', function(done) {
it('should break hashtags with prefixed with spaces - non decorated', function (done) {
return assertEqual(done, expect, inputs, outputs, breakHashtags);
});
it('should break hashtags with prefixed with spaces - decorated', function() {
return assertEqual(done, expect, inputs, outputs, breakHashtags, decorator);
});
});
describe('handle bars integration', function() {
var outerId = "container",
outerClass = "inner",
fixture = '<div id="' + outerId + '"></div>',
template = Handlebars.compile('<div class="' + outerClass + '">{{breakHashtags hashtags}}</div>'),
decoratedTemplate = Handlebars.compile('<div id="inner">{{breakHashtags hashtags decoratorHelper}}</div>');
beforeEach(function() {
addFixture(fixture);
});
afterEach(function() {
clearMyFixtures();
Handlebars.helpers['decoratorHelper'] && delete Handlebars.helpers['decoratorHelper'];
});
it('should have the breakHashtags function registered as a helper', function() {
expect(Handlebars.helpers['breakHashtags']).toEqual(breakHashtags);
});
it('should replace hashtags with hashtags prefixed with spaces', function(){
var realValues = getRealTemplatValues(inputs, template, outerId, outerClass);
assertEqual(done, expect, inputs, realValues, breakHashtags);
});
it('should replace hashtags with hashtags prefixed with ' +
'spaces and invoke the decorator on theo put', function(){
Handlebars.registerHelper('decoratorHelper', decorator);
var realValues = getRealTemplatValues(inputs, decoratedTemplate, outerId, outerClass);
assertEqual(done, expect, inputs, realValues, breakHashtags, decorator);
});
});
});
helpers.js:
function breakHashtags (text, decorator) {
var pattern = /\w(#).+/i,
p1, p2, idx = text.search(pattern), prefix = '';
while (idx > 0) {
if (idx === 1) {
text = text.substring(idx);
prefix = text.substring(0, 1);
}
else{
p1 = text.substring(0, idx + 1);
p2 = text.substring(idx + 1);
text = p1 + ' ' + p2;
console.log(p1, p2, text)
}
idx = text.search(pattern);
}
return !!decorator ? decorator(prefix + text) : prefix + text;
}
Handlebars.registerHelper('breakHashtags', breakHashtags);
Благодарим вас за вход сэр. Я создам помощник жасмина, который создает тестовый пример для списка входов против списка выходов, если он еще не существует. –
да, это хорошая идея. и это относительно простая задача - несколько строк кода – piotrek
Кстати, вы действительно должны указать атрибуты DDO 'priority' и' terminal' в своей статье с угловыми вложенными директивами в своем блоге –