Какова роль описания() в Мокко? - программирование
Подтвердить что ты не робот

Какова роль описания() в Мокко?

Документация на официальном сайте Mocha содержит этот пример:

describe('User', function(){
  describe('#save()', function(){
    it('should save without error', function(done){
      var user = new User('Luna');
      user.save(function(err){
        if (err) throw err;
        done();
      });
    })
  })
})

Я хочу знать, когда я должен гнезжусь мои тесты в describe функции и то, что основная цель describe это. Могу ли я сравнить первый аргумент, переданный для describe с комментариями на языке программирования? Ничего не показано describe в выводе на консоли. Это только для удобства чтения, или есть какое-то другое использование для этой функции?

Что-то не так, если я использую это так?

describe('User', function(){
    describe('#save()', function(){
        var user = new User('Luna');
        user.save(function(err){
            if (err) throw err;
            done();
        })
    })
})

Если я делаю это таким образом, тест все равно проходит.

4b9b3361

Ответ 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.

Ответ 2

Насколько мне известно, описать на самом деле просто для людей... Таким образом, мы можем видеть разные области приложения. Вы можете вложить уровни n уровней глубоко.

describe('user',function(){
    describe('create',function(){}
});

Ответ 3

Трудно добавить превосходный ответ Луи. Есть несколько преимуществ блока описания, о которых он не упоминал, которые являются функциями skip и only.

describe.skip(...) {
...
}

пропустит этот описатель, и все его вложенное описание будет описано, а оно будет функционировать, пока:

describe.only(...) {
...
}

выполнит только этот описатель, а его вложенное описание и его функции. Модификаторы skip() и only() также могут быть применены к функциям it().

Ответ 4

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

Ответ 5

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

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

var User = function() {
    const self = this;

    function setName(name) {
        self.name = name
    }

    function getName(name) {
        return self.name;
    }


    return{setName, getName};
}

module.exports = User;

И его нужно протестировать, поэтому для модульного теста создается файл спецификации.

var assert = require('assert');
var User = require("../controllers/user.controller");

describe("User", function() {
    describe('setName', function() {
        it("should set the name on user", function() {
            const pedro = new User();

            name = "Pedro"
            pedro.setName(name);
            assert(pedro.getName(), name);
        });
    });
});

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