Ответ 1
Вызов it
идентифицирует каждый отдельный тест, но сам по себе it
не сообщает Mocha о том, как структурирован ваш тестовый пакет. Как вы используете вызов describe
, это то, что дает структуру вашему тестовому набору. Вот некоторые из вещей, которые используют describe
для структурирования вашего набора тестов для вас. Вот пример тестового набора, упрощенного для обсуждения:
function Foo() {
}
describe("Foo", function () {
var foo;
beforeEach(function () {
foo = new Foo();
});
describe("#clone", function () {
beforeEach(function () {
// Some other hook
});
it("clones the object", function () {
});
});
describe("#equals", function () {
it("returns true when the object passed is the same", function () {
});
it("returns false, when...", function () {
});
});
afterEach(function () {
// Destroy the foo that was created.
// foo.destroy();
});
});
function Bar() {
}
describe("Bar", function () {
describe("#clone", function () {
it("clones the object", function () {
});
});
});
Предположим, что Foo
и Bar
являются полноценными классами. Foo
имеет методы clone
и equals
. Bar
имеет clone
. Структура, описанная выше, является одним из возможных способов структурирования тестов для этих классов.
(Обозначение #
используется некоторыми системами (например, jsdoc) для указания поля экземпляра. Поэтому, когда оно используется с именем метода, оно указывает метод, вызываемый экземпляром класса (а не класс, который вызывается для самого класса). Набор тестов также будет работать без присутствия #
.)
Предоставить баннеры
Некоторые из репортеров Mocha показывают имена, которые вы даете describe
в отчетах, которые они создают. Например, репортер spec
(который вы можете использовать, запустив $ mocha -R spec
), сообщит:
Foo
#clone
✓ clones the object
#equals
✓ returns true when the object passed is the same
✓ returns false, when...
Bar
#clone
✓ clones the object
4 passing (4ms)
Справка Выберите части для запуска
Если вы хотите запустить только некоторые из тестов, вы можете использовать опцию --grep
. Поэтому, если вы заботитесь только о классе Bar
, вы можете сделать $ mocha -R spec --grep Bar
и получить результат:
Bar
#clone
✓ clones the object
1 passing (4ms)
Или если вы заботитесь только о методах clone
для всех классов, тогда $ mocha -R spec --grep '\bclone\b'
и получите результат:
Foo
#clone
✓ clones the object
Bar
#clone
✓ clones the object
2 passing (5ms)
Значение, указанное в --grep
, интерпретируется как регулярное выражение, поэтому, когда я передаю \bclone\b
, я прошу только слово clone
, а не такие вещи, как clones
или cloned
.
Предоставить крючки
В приведенном выше примере вызовы beforeEach
и afterEach
являются перехватами. Каждый крючок влияет на вызовы it
, которые находятся внутри вызова describe
, который является родительским элементом hook. Различные крючки:
-
beforeEach
, который выполняется перед каждым отдельнымit
внутри вызоваdescribe
. -
afterEach
, который запускается после каждого отдельногоit
внутри вызоваdescribe
. -
before
, который запускается один раз перед тем, как выполняется любой изit
внутри вызоваdescribe
. -
after
, который запускается один раз после запуска индивидуальногоit
внутри вызоваdescribe
.
Эти крючки могут использоваться для получения ресурсов или создания структур данных, необходимых для тестирования, а затем для освобождения ресурсов или уничтожения этих структур (если необходимо) после завершения тестов.
Фрагмент, который вы покажете в конце вашего вопроса, не приведет к ошибке, но на самом деле он не содержит никакого теста, потому что тесты определяются it
.