Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Обсуждений тред (https://javascript.ru/forum/offtopic/47364-obsuzhdenijj-tred.html)

kobezzza 03.08.2014 12:50

Цитата:

Не могу понять как эти штуки работают
https://github.com/kobezzza/Collecti...orage.es6#L334

it не начнёт выполняться пока beforeEach не выполнится, т.е. не вызовет done. С afterEach тоже самое, только после выполнений.

cyber 03.08.2014 21:05

kobezzza, вот что получилось в итоге, теперь я понял почему нужно писать тесты :)

describe('new ModalJS', function()  {

    var modal;

    it( 'new Object', function()  {

        modal = new ModalJS();

        expect( typeof modal  )
            .toBe( "object" );
    });

    it ( "Create overlay", function () {

        expect ( isHTMLElement( modal.overlay) )
            .toBe( true );

        expect ( modal.overlay.parentElement )
            .toBe( document.body );


    } );

});

function isHTMLElement( elem ) {
    return (typeof elem === "object") &&
        (elem.nodeType === 1) && (typeof elem.style === "object") &&
        (typeof elem.ownerDocument ==="object");
}

describe ( "Methods", function () {

    var modal, win;

    function resetWindow ( ) {

            win = document.getElementById( "modal-test-win");
            win2 = document.getElementById( "modal-test-win2");
            modal = new ModalJS( {
                NotUseAnimate: true
            } ).setWindow ( win || win2 );
    }

    resetWindow();

    it( "set window", function ()  {

        expect( modal.setWindow ( win ))
            .toEqual ( modal );
    });


    it ( "Show window", function ( ) {

        expect ( modal.show () )
            .toBe ( true );
    } );

    it ( "Hide window", function ( ) {

        expect ( modal.hide () )
            .toBe ( true );
    } );


    it ( "Window destroy", function ( ) {

        expect ( modal.destroy( ) )
            .toBe ( true );

    } );


    it ( "Window destroy [remove Window]", function ( ) {

        resetWindow ( );

        expect ( modal.destroy( true ) )
            .toBe ( true );

        expect ( modal.window )
            .toBeUndefined();
    } );


} );


describe ( "Async animate", function ( ) {

    var win2 = document.getElementById( "modal-test-win2"),
        modal = new ModalJS().setWindow ( win2 );

    beforeEach( function ( done )  {

        modal.on ( "showed", done );
        modal.show();
    } );


    it ( "Hide window", function ( done ) {

        modal.on ( "closed", done );
        modal.hide();

    } );

});

melky 03.08.2014 22:33

Цитата:

Сообщение от cyber
теперь я понял почему нужно писать тесты

но ты не понял , как их писать и зачем :(

cyber 04.08.2014 00:12

melky где по читать можно?

l-liava-l 04.08.2014 00:45

Дайте мне гениальную идею для новой приложухи

melky 04.08.2014 08:51

Цитата:

Сообщение от l-liava-l (Сообщение 324137)
Дайте мне гениальную идею для новой приложухи

нормальный, не косой PopcornTime. это single page webapp ;)

Цитата:

Сообщение от cyber (Сообщение 324133)
melky где по читать можно?

как-то так:
http://habrahabr.ru/post/207794/
http://habrahabr.ru/post/186666/

ну а лучше открыть проект на гибхабе и посмотреть его тесты :)

visionmedia неплохо писал тесты:

https://github.com/visionmedia/page..../test/tests.js

а ещё лучше - послухать мнение других разработчиков о тестах :)

cyber 04.08.2014 14:11

Цитата:

Сообщение от melky
а ещё лучше - послухать мнение других разработчиков о тестах

Поделишься своим?)

Octane 05.08.2014 13:15

Цитата:

Сообщение от melky
глянь brunch и webpack, настаиваю) не теряй на browserify время

Не нашел ни в одном возможности автоматически именовать модули, как в LMD.
Например, есть такая структура файлов и каталогов:
Код:

pages
|–– profile
|  |––index.js
|–– question
    |––index.js

blocks
|–– user
|  |–– index.js
|–– statistics
    |–– index.js

modules
|–– api.js
|–– cookie.js
|–– time.js

и мы хотим подключать модули следующим образом:
var ProfilePage = require('profile-page'),
    QuestionPage = require('question-page'),
    UserBlock = require('user-block'),
    StatisticsBlock = require('statistics-block'),
    api = require('api'),
    cookie = require('cookie'),
    time = require('time');

в LMD для этого достаточно написать небольшой конфиг:
{
    …
    modules: {
        '<%= file %>': 'modules/*.js'
        '<%= dir[0] %>-block': 'blocks/*/*.js'
        '<%= dir[0] %>-page': 'pages/*/*.js'
    },
    …
}
Какой еще сборщик модулей так может?

cyber 05.08.2014 13:40

melky, я прочитал обе статьи и по читал те тесты на которые ты дал ссылку и пока вижу только 2 ошибки:
1. не правильно подписанные названия для тестов
2. плохо разбитые на группы ( т.е с помощью describe )

А что не так в самих тестах? Я просто не представляю что еще можно тестировать?

melky 05.08.2014 16:11

Octane, из коробки не может. решается плагином. хотя если расширить функционал алисов (добавить возможность передачи функции.. или строки регвыра для конструктора RegExp в качестве ключа, например.), то можно и сделать из коробки

например, стало бы так:

// module.exports.resolve.alias ...
{
'([^-])-page': 'pages/$1/$1.js'
}


alert(    'profile-page'.replace(new RegExp('([^-]+)-page'), 'pages/$1/$1.js'  )); // pages/profile/profile.js


годная фишка, спасибо, Octane. возьму на заметку.

Цитата:

Сообщение от Octane
Какой еще сборщик модулей так может?

зачем так вообще делать ? :)
var ProfilePage = require('profile-page')

абстракция от файловой структуры проекта, конечно, хорошая, но не пойму, почему логика идёт от частного (profile) к общему (page) :)


Цитата:

Сообщение от cyber (Сообщение 324367)
melky, я прочитал обе статьи и по читал те тесты на которые ты дал ссылку и пока вижу только 2 ошибки:
1. не правильно подписанные названия для тестов
2. плохо разбитые на группы ( т.е с помощью describe )
А что не так в самих тестах?

угумс.

но jasmine - BDD, значит нужно следовать принципам BDD:
it ( "Show window", function ( ) {

        expect ( modal.show () )
            .toBe ( true );
    } );

    it ( "Hide window", function ( ) {

        expect ( modal.hide () )
            .toBe ( true );
    } );

как ты проверил, что модальное окно скрыто \ показано ? уверен ли ты в том, что эти оба метода работают верно ?

по BDD:
Попробуй удалить класс модального окна и оставить только тесты. Они начнут проваливаться (перестанут проходить). Попробуй написать класс модального окна, чтобы все тесты начали проходить. Скорее всего, в методах hide и show будет такой код:
Modal.prototype.show = Modal.prototype.hide = function () { return true };


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

с багами\фичами так же - пишешь сначала тест, потом код. тесты проходятся - ништяк, всё готово.

понимаешь примерно, что делают тесты и какие они должны быть (в BDD)?

хм, вообще пример с модальным окном плохой для тестирования. легче протестировать какое-нибудь математическое уравнение прямой (т.е. функцию), или факториал - то, что попроще.



картинка относится к TDD , но вполне отражает суть.

разница между TDD и BDD в том, какие сами тесты (синтаксис) и что они тестируют

Цитата:

Сообщение от cyber (Сообщение 324367)
Я просто не представляю что еще можно тестировать?

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

трудно сказать, что можно тестировать - легче сказать, что нельзя тестировать))

мне трудно представить, как тестировать внешний вид (интерфейс) сайта. вот наверное его и нельзя.

Octane 05.08.2014 16:38

Цитата:

Сообщение от melky
зачем так вообще делать?

Очевидно это лучше, чем писать require('./pages/profile/index.js'), если структура каталогов или имена файлов поменяются, мне нужно будет только поправить LMD конфиг, а не выполнять замены во всех файлах. Да и запись короче.

Цитата:

Сообщение от melky
абстракция от файловой структуры проекта, конечно, хорошая, но не пойму, почему логика идёт от частного (profile) к общему (page)

А как лучше назвать модуль страницы?

melky 05.08.2014 16:47

Цитата:

Сообщение от Octane
Очевидно это лучше, чем писать require('./pages/profile/index.js'), если структура каталогов или имена файлов поменяются, мне нужно будет только поправить LMD конфиг, а не выполнять замены во всех файлах. Да и запись короче.

хз, я бы написал require('pages/profile') и в алиасах указал путь к одному каталогу "pages" , если это было бы необходимо

и при смене файловой структуры я бы так же, поменял\добавил алиас к одному только каталогу "pages"

('index.js' сам подставится, как файл по умолчанию - commonjs)

Цитата:

Сообщение от Octane
А как лучше назвать модуль страницы?

page, всё верно ты назвал) я про порядок - что в require должно идти первым - "pages", или "profile"
require("pages/profile")
require("profile/pages")

есть ведь разница?

Octane, а можно ли с помощью LMD собрать Coffee-script\ES6?
как раньше не смог нагуглить, так и сейчас не получается

Octane 05.08.2014 17:04

Цитата:

Сообщение от melky
page, всё верно ты назвал) я про порядок - что в require должно идти первым - "pages", или "profile"

хз я не порядком руководствовался, а английским написанием "profile page", дефис вместо пробела.

Цитата:

Сообщение от melky
а можно ли с помощью LMD собрать Coffee-script\ES6?

ES6 модули (System.import) не умеет, а так в чем проблема сначала прогнать файлы через препроцессор, а потом отдать их lmd.

Safort 05.08.2014 20:16

СТАЙЛУСОБОГИ, нужна ваша помощь в одном простеньком вопросе http://javascript.ru/forum/xhtml-htm...rosaetsya.html

// надеюсь тут можно рекламить свои же темы, срачатред ведь..

ixth 05.08.2014 21:33

Давно хотел спросить. Какого черта все объявляют функции таким сложным способом: var fname = function () {};? Чем он лучше простого function fname() {}?

Safort 05.08.2014 21:38

ixth,
мб смотря что за код. Мб где-то там оно в условиях используется.

bes 05.08.2014 21:46

Цитата:

Сообщение от ixth
Давно хотел спросить. Какого черта все объявляют функции таким сложным способом: var fname = function () {};? Чем он лучше простого function fname() {}?

какого чёрта ты не заглянул в учебник

ixth 05.08.2014 21:57

Цитата:

Сообщение от bes (Сообщение 324478)
какого чёрта ты не заглянул в учебник

Какого черта ты не показал куда именно мне заглянуть?

Safort 05.08.2014 22:00

ixth,
как-то так http://learn.javascript.ru/function-...ion-expression

ixth 05.08.2014 22:01

Цитата:

Сообщение от Safort (Сообщение 324477)
ixth,
мб смотря что за код. Мб где-то там оно в условиях используется.

Нет, их так именно объявляют. С более сложными вариантами ясно (зачем в одну переменную дожить несколько разных функций — отдельный вопрос).

ixth 05.08.2014 22:06

Цитата:

Сообщение от Safort (Сообщение 324484)

Я знаю что такое function expression. Зачем использовать такой способ, если есть более простой function declaration? С ним работает хойстинг, он лучше оптимизируется и сжимается.

Safort 05.08.2014 22:14

ixth,
у меня пока что два варианта:
1. Хочется
2. Для оптимизации
Вот примерчик

//не оптимизированный вариант
  function fun(i) {  ...  }
  function fun2(i) {  ...  }

  for (var i = 0; i < мильён; i++) {

    if (условие) {
      fun(i);
    } else {
      fun2(i);
    }

  }




// оптимизорованный
  function fun(i) {  ...  }
  function fun2(i) {  ...  }

  var f;

  if (условие) {
    f = fun;
  } else {
    f = fun2;
  }

  for (var i = 0; i < мильён; i++) {
    f(i);
  }

kobezzza 05.08.2014 22:23

В ES5 FunctionDeclaration обязан быть либо вверху глобали, либо функции, т.е.

function foo() {
    'use strict';
    if (true) {
        function bar() { // Error
        }
    }
}


В ES6 обсуждают концепцию локальных деклараций, а пока юзаю let + FunctionExpression если нужно такое.

bes 05.08.2014 22:31

Цитата:

Сообщение от ixth
Какого черта ты не показал куда именно мне заглянуть?

какого чёрта ты такой наглый и не умеешь гуглить
http://javascript.ru/basic/functions

ixth 05.08.2014 22:55

Цитата:

Сообщение от kobezzza (Сообщение 324491)
В ES5 FunctionDeclaration обязан быть либо вверху глобали, либо функции, т.е.

function foo() {
    'use strict';
    if (true) {
        function bar() { // Error
        }
    }
}


В ES6 обсуждают концепцию локальных деклараций, а пока юзаю let + FunctionExpression если нужно такое.

Да, но "вверху глобали" !== "выше в коде", так?

Такой пример у меня нормально отрабатывает:
function foo() {
    'use strict';
    var a = 1;

    return a + bar();

    function bar() {
        return 1;
    }
}

kobezzza 05.08.2014 22:59

Цитата:

Да, но "вверху глобали" !== "выше в коде", так?
Ну имеется ввиду не может быть вложен в блок, там if и т.д.

Цитата:

Такой пример у меня нормально отрабатывает
Ну разумеется :)

Safort 05.08.2014 23:02

ixth,
Цитата:

Такой пример у меня нормально отрабатывает
канешн отрабатывает, там же объявляется фанкшн внутри фанкшн, так дозволено делать.

ixth 05.08.2014 23:38

Цитата:

Сообщение от bes (Сообщение 324493)
какого чёрта ты такой наглый

Патамучто я дольше на раене-на!



Цитата:

Сообщение от bes (Сообщение 324493)
и не умеешь гуглить http://javascript.ru/basic/functions

Спасибо, я знаю основы.

Я думал, возможно, есть какая-то особая магия, о которой я не знаю. Но судя по всему все делают, потому что Резиг так сказал. Но резюме отсюда немного отрезвляет, конечно.

ixth 05.08.2014 23:39

Цитата:

Сообщение от kobezzza (Сообщение 324501)
Ну имеется ввиду не может быть вложен в блок, там if и т.д.

Отлично. Я привык, что функции внутри скоупа — как сноски, внизу.

nerv_ 06.08.2014 16:51

Цитата:

Сообщение от melky
разница между TDD и BDD в том, какие сами тесты (синтаксис) и что они тестируют

может ты нам еще про разницу между unit & e2e расскажешь? :)

melky 06.08.2014 17:21

Цитата:

Сообщение от nerv_ (Сообщение 324666)
может ты нам еще про разницу между unit & e2e расскажешь? :)

лучше вас послушаю)

bes 06.08.2014 19:38

Цитата:

Сообщение от ixth
Патамучто я дольше на раене-на!

а, это ты тот чувак, которого Ной не смог утопить в конце фильма :D

Цитата:

Сообщение от ixth
Спасибо, я знаю основы.

заблуждаться не запрещается ;)

Цитата:

Сообщение от ixth
Но резюме отсюда немного отрезвляет, конечно.

ну ладно коли отпустило :D
не привлекай чертей без крайней необходимости и будет тебе счастье :yes:

cyber 09.08.2014 17:27

Чет я не много не вкурю, нужно перехватить запрос сайт с помощью node.js
к примеру идет запрос на гугл.com, пытаюсь сделать так но не работает

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
  
}).listen(80, 'google.com', function  ( ) {
	console.log( "work" );
} );

melky 09.08.2014 17:29

Цитата:

Сообщение от cyber (Сообщение 325068)
Чет я не много не вкурю, нужно перехватить запрос сайт с помощью node.js
к примеру идет запрос на гугл.com, пытаюсь сделать так но не работает

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
  
}).listen(80, 'google.com', function  ( ) {
	console.log( "work" );
} );

в hosts попробуй добавить google.com на 127.0.0.1

cyber 09.08.2014 17:48

Цитата:

Сообщение от melky
в hosts попробуй добавить google.com на 127.0.0.1

не работает

melky 09.08.2014 18:42

Цитата:

Сообщение от cyber
не работает

и убрать аргумент 'google.com'

kobezzza 09.08.2014 20:01

уффффф, чёто я опять перебрал:blink: , всем мир!

Safort 09.08.2014 20:50

kobezzza,
здравствуй. А я опять переел и заснул под вечер(

ixth 09.08.2014 20:54

А я пиццу заказал. И кино про Роберта Смита с Шоном Пенном посмотрел.


cyber 09.08.2014 21:14

Цитата:

Сообщение от Safort
здравствуй. А я опять переел и заснул под вечер(

Держи нас в курсе :)


Часовой пояс GMT +3, время: 05:11.