LINUX.ORG.RU

JavaScript. Проверка типов элементов массивов.

 , , , ,


1

1

Хочу, чтобы в юнит-тестах проверялся тип возвращаемого в callback-е значения: array of string.

В статике (Pascal, C#, Ява) это делает компилятор, а в динамике - это же обязаны делать юнит-тесты, так ведь?

Использую chai.js, типа стандарт де-факто. Сам он не умеет это делать. ОК, есть плугин chai-things.

Пишу:

var list = ['1', '2']

should.exist(list) // Passed

list.should.be.an('array') // Passed
     .with.length(2) // Passed
     .and.all.be.an('string') // Failed: expected '1' to be a string

Т.е. эта редиска не умеет проверять тип элементов массивом. Написал в баг-трекер проекта, жду, что ответит аффтар.

JavaScript 1995-2015. 20 лет на рынке наступания на грабли.

Зы. Теперь я понимаю, почему TJ ушел на Go.

Зы. зы. Интерсно, через сколько месяцев они все таки реализуют сабж.



Последнее исправление: EnterpriseMobility (всего исправлений: 1)

Не пользуйся стандартом дефекто, пиши юнит-тесты на нормальном яваскрипте, в нём всё работает.

Goury ★★★★★
()

В jsdoc можно указывать типы параметров и результата для функции. Неужели нет какого-нибудь препроцессора, который функцию обернёт проксей, где автоматически сгенерирует все эти проверки, вытащив их из jsdoc?

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

В JSDoc ты не укажешь это

И ты там не напишешь тип 2-го параметра колбека.

Для этого JSDoc не предназначен. Нужны тесты

EnterpriseMobility
() автор топика
Ответ на: комментарий от EnterpriseMobility

Написать в юнит-тесте отдельную функцию проверки типов элементов массива. Хотя, учитывая динамику яваскрипта, наверное можно и прямо подменить and.all.be.an своим кодом (но это уже фантазия и совсем не обязательно).

staseg ★★★★★
()
Ответ на: комментарий от EnterpriseMobility

А как эта проблема может проявить себя в языке с сильной типизацией?

winlook38 ★★
()

проверялся тип возвращаемого в callback-е значения: array of string

Зачем. Что за тупая проверка. Передал в функцию массив строк и проверил, что это правда массив строк.

special-k ★★★★
()
Ответ на: комментарий от EnterpriseMobility

вот из-за таких как ты альтернативно одаренных JS и ругают

list.every(function(elem){elem.should.be.a('object')})

как это твое говно работает, вообще непонятно, там должен быть ретурн, дебил.

list.every(function(x){return typeof x === "number"})

anonymous
()
Ответ на: комментарий от EnterpriseMobility

зы Ну и когда в ноде появятся стрелки?

и соски. пиши на жабе. программирование — это не твое.

anonymous
()
Ответ на: комментарий от EnterpriseMobility

а затем, чтобы из ассерта было явно видно, что упало - вернулся не массив объектов, а массив строк


if(!list.every(isObject)) throw "I am a stupid whore"

anonymous
()
Ответ на: комментарий от anonymous

elem.should.be.a

цирк уехал, а клоуны остались.

anonymous
()
Ответ на: комментарий от EnterpriseMobility

should бросает исключение, возвращаемое значение не нужно

тогда тебе любая итерация по списку подойдет, хоть цикл. че ты людям мозг компостируешь? Да еще с понтами. Если ты нулевой, так и скажи, дядечки, помогите убогому. Свои рассуждения о джаваскрипте себе в разодранное очко засунь.

anonymous
()
Ответ на: комментарий от EnterpriseMobility

Там и так синтаксического мусора навалом, из-за таких вот тормозов как ты. Я не стал пояснять, потому что для любой особи с >2 извилинами в мозгу, смысл и так понятен.

anonymous
()
Ответ на: комментарий от EnterpriseMobility

Да кто же мог угадать твои тайные дебильные мысли. Обычно для итерации используется forEach либо for, every для других целей предназначен.

anonymous
()
Ответ на: комментарий от EnterpriseMobility

как раз для задачь подобных твоей, только если решать их не через жопу. if(every(predicat)) doStaff

значение predicat пояснять надо, лалочка? Или будешь искать его в нейтив js?

anonymous
()
Ответ на: комментарий от anonymous

У меня было тяжелое децтво: денди у друга, прибитый к полу спектрум и спаянный из стыренных деталей ЮТ-88 и стыренные с папиной работы БЗ-21.

Ну и БК в школе.

Там мы обходились FOR ... NEXT

И никаких repeat .. until , while и foreach

Зы. Кстати, какого хрена в JS нет цикла , который возвращал и ключи и значения?

Object.keys(myDict).forEach(function (key) { key, myDict[key] })

При C# такого не было

EnterpriseMobility
() автор топика
Ответ на: комментарий от anonymous

так бы и написал, что внутри closure НЕЛьЗЯ выбрасывать исключение:

// Если isObject только один раз - можно инлайнить декларацию var isObject = function(o){return typeof o === 'object'} list.every(isObject).should.be.ok

И, да, где все эти Style Guides для JS можно найти?

EnterpriseMobility
() автор топика
Последнее исправление: EnterpriseMobility (всего исправлений: 1)
Ответ на: комментарий от EnterpriseMobility

что внутри closure НЕЛьЗЯ выбрасывать исключение:

как это следует из того что я написал? Можно, блеать, бросать, и замыкания тут не при чем вообще. Просто у тебя чрезжопный подход, там где все просто, ты городишь какую-то ахинею, читающий твой код не врубится с ходу, что ты хотел этим сказать.

Style Guides для JS можно найти?

завоняло ынтерпрайзной быдлятиной. Пойду-ка я отсюда.

anonymous
()
Ответ на: комментарий от anonymous
result={}
for (var i in object) {
 if(!object.hasOwnProperty(i)) break; result[i]=object[i]
}

//fixed

anonymous
()
Ответ на: комментарий от EnterpriseMobility

Кстати, какого хрена в JS нет цикла , который возвращал и ключи и значения?

тебе в каком виде нужен возврат? можно например, в виде объекта — копии существующего. В коде ниже, такая ф-ция возвратит копию объекта, без учета его наследования. А функция clone, в данном примере, создает как бы клон объекта, получая цепочку наследования оригинала.

o=Object.prototype

o.copy=function(){
 var result={}
 for(var i in this){
   if(!this.hasOwnProperty(i)) return result
   result[i]=this[i]
 }
}

o.clone=function(){
 var result=Object.create(this.__proto__)
 for(var i in this){
   if(!this.hasOwnProperty(i)) return result
   result[i]=this[i]
 }
}


delete o

o={foo: "bar"}

o1=Object.create(o)
o1.moo=1

o2=o1.copy()
o3=o1.clone()

console.log(
 o2.foo, o2.moo, o3.foo, o3.moo //undefined 1 bar 1
)

Также можно создать что-то вроде глубокой копии объекта, скопировав в результат все поля предков, для этого надо убрать ветку с проверкой hasOwnProperty, но делать этого я не рекомендую, из-за неоправданного расхода памяти, и путаницы в архитектуре.

Само-собой, можно получить и любую другую структуру данных на выходе. Все зависит от задачи.

jackdempsey2015
()

TypeScript нужен тебе.

dib2 ★★★★★
()
Ответ на: комментарий от EnterpriseMobility

Ну и когда в ноде появятся стрелки?

https://code.google.com/p/v8/issues/detail?id=2700
Вот-вот. Вот мы и дожили, как говориться. Кроме того есть же coffee.

Убогенький недоязычок

В каких языках есть стрелки, напомни мне.

special-k ★★★★
()
Ответ на: комментарий от EnterpriseMobility

какого хрена в JS нет цикла

$%ять сделай!

В coffee, опять же, есть.

special-k ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.