Pull to refresh

Comments 19

От себя добавлю, остальным на заметку: Не нужно использовать Mongoose.
Последние версии официального драйвера во всем превосходят довольно отсталый Mongoose.

А еще в Mongoose не правильная реализация промисов.
Из документации mongoose

Mongoose 5.0 will use native promises by default (or bluebird,
if native promises are not present) but still
support plugging in your own ES6-compatible promises library. Mongoose 5.0
will not support mpromise.
А можно более подробно насчет превосходства?
Интересуют следующие пункты:
1) Поддержка промисов
2) Валидация полей
3) Псевдо join'ы (Аналог populate)
4) Хуки
Мнение основанное на личном опыте?

1) Да

2) Нет надобности и это антипаттерн. Данные надо проверять самостоятельно с помощью JSON Schema.
Это добавляет гибкости при работе. К примеру, данные можно отбросить на входе, а не перед самой записью в базу данных.
Таким образом, весь код которые работал до этого не подвергается риску работы с invalid objects.

3) Нету как и в самой базе данных :) Data Models > Data Model Reference > Database References
За пару лет работы с нодой и монгой понадобилось сделать ссылку ровно 2 раза.

4) Не знаю что это.

В целом, работа с нативным драйвером после Mongoose это танец на радуге удобства и изобилия.
>4) Не знаю что это.
Что мешает загуглить это и ответить более полно?

Ок, минусуйте и продолжайте есть кактус. А я перешел на tape и сказать не могу, как рад.

k12th, глубоко лезть не стал в tape. На первый взгляд да приятно, но
  1. Как я понял сделать вложенные утверждения не получится
    пример
    Например «создание книги»:
    1. книга создается успешно
    2. при отсутствии поля N выдается ошибка
    3. при отсутствии заголовка H возвращается 403

    Для каждого такого описание придется делать отдельный файл, чтобы получить соответствующий вывод.

    Mocha же дает структурированный вывод + tape формат можно подключить с помощью плагина

  2. Общая настройка фикстур бывает нужна при негативном или альтернативном тестировании, когда есть набор данных и он заполняется перед группой тестов и после нее гасится

Это то, что на первый взгяд вызвало сомнения в удобстве tape.
Хотя все наверно зависит от выработанного workflow/структуры проекта

Нет, можно вкладывать сколько угодно, если хочется, в том числе и так, как вы написали, у меня есть пример. Но, сказать по правде, «плоские» тесты проще писать и поддерживать в долгой перспективе.
Вложенность ведет к тому, что начинаешь опираться на состояние, оставшееся после предыдущего теста.

let express = require('express');

Ммм. А какой смысл там использовать let, а не const? Включите prefer-const везде =).

с вами полностью согласен. код брал as-is из оригинала. в конкретно данном примере разницы особой нет, хоть var пиши

Извините, не увидел, что это перевод.

Объясните мне, пожалуйста, неужели приятно использовать chai?
Вот эта вот вся магия типа req.should.have.status(200), её же писать умучаешься!
Для себя решил что всегда в качестве assert-библиотеки буду использовать power-assert: assert(req.status === 200) — всё чётко и понятно, писать проще, читать легче, а power-assert даёт понятное описание ошибки.
Может быть я сильно заблуждаюсь а chai является верхом инженерной мысли?

Ну в принципе const assert = require('chai').assert;.
А это все should.have идет из BDD, когда решили, что лучше тестировать поведение программы и что для этого почему-то нужно соорудить свой якобы человекопонятный DSL.

chai дает даёт ассерты описаные языком близким к натуральному. к тому у chai есть удобный chain механизм.
Например, мы ждем от api в ответ json c какой-то конкретной ошибкой. Sould синтаксис дает понимание что мы хотим


req.body.should.be.an.Object().which.has.property('error','error text')

Ваш подход больше подходит тем, кто сам себе и программист и тестироващик. И это все-таки ближе к идеям tdd, так как не описывает поведение, а проверяет код.


A bdd — это по сути переложение тех.задания тестировщиком с учетом различных use-case. Оно и код проверяет и поведение описывает.

Chain механизм вполне работает и со стандартными && операторами, ваш пример можно записать так:


assert(typeof req.body === "object" && "error text" === req.body.error)
Ну или два assert написать, будет ещё читаемее. Писать это несравненно легче.


Я действительно пробовал писать проверки в стиле should/expect, очень бесило то, что постоянно приходится лазить в документацию на первых этапах.


Описание условий формальным языком работало бы, если весь тест им описывался. А по факту — формальным языком описываются только ассерты, а код теста всё равно на обычном ЯП (в нашем случае javascript). В итоге тестировщику проще нучиться js, раз уж его всё равно надо знать.


Ну и использование bdd-style проверок не делает тест автоматически проверяющим поведение. Я видел кучу юнит тестов, в которых проверки написаны в стиле expect/should.


В итоге — не переубедили :) Я всё ещё считаю что expect/should синтаксис — оверинжениринг из разряда "потому что можем" с сомнительным профитом

Sign up to leave a comment.

Articles