Что такое "утверждать" в JavaScript?

Что означает assert в JavaScript?

Я видел что-то вроде:

assert(function1() && function2() && function3(), "some text");

И хотел бы знать, что делает метод assert().

Ответ 1

В JavaScript нет assert (пока нет о добавлении одного, но это на ранней стадии). Возможно, вы используете некоторую библиотеку, которая обеспечивает ее. Обычное значение - это выбросить ошибку, если выражение, переданное в функцию, является ложным; это часть общей концепции проверки утверждения. Обычно утверждения (как их называют) используются только в "тестировании" или "отладочных" сборках и удалены из производственного кода.

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

assert(typeof argumentName === "string");

... где assert выдаст ошибку, если условие было ложным.

Очень простая версия будет выглядеть так:

function assert(condition, message) {
    if (!condition) {
        throw message || "Assertion failed";
    }
}

Еще лучше, используйте объект Error, если движок JavaScript поддерживает его (действительно старые могут не быть), что имеет преимущество сбора трассировки стека и т.д.

function assert(condition, message) {
    if (!condition) {
        message = message || "Assertion failed";
        if (typeof Error !== "undefined") {
            throw new Error(message);
        }
        throw message; // Fallback
    }
}

Даже IE8 имеет Error (хотя он не имеет свойства stack, но современные двигатели [включая современный IE]).

Ответ 3

Другие ответы хороши: в ECMAScript5 нет встроенной функции assert (например, JavaScript, которая работает практически везде), но некоторые браузеры предоставляют ее вам или имеют надстройки, которые обеспечивают эту функциональность. Хотя, вероятно, лучше всего использовать хорошо установленную/популярную/поддерживаемую библиотеку для этого, для академических целей функция "плохого человека" может выглядеть примерно так:

var assert = function(condition, message) { 
    if (!condition)
        throw Error("Assert failed" + (typeof message !== "undefined" ? ": " + message : ""));
};

assert(1===1); // executes without problem
assert(false, "Expected true"); // yields "Error: Assert failed: Expected true" in console

Ответ 4

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

Ответ 5

проверьте это: http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-quick-and-easy-javascript-testing-with-assert/

он предназначен для тестирования JavaScript. Удивительно, что на уровне едва ли пяти или шести строк этот код обеспечивает отличный уровень мощности и контроль над вашим кодом при тестировании.

Функция assert принимает два параметра:

result: Логическое значение, которое указывает, прошел ли ваш тест или не прошел

description: Краткое описание вашего теста.

Затем функция assert просто создает элемент списка, применяет класс "pass" или "fail", зависящий от того, возвращался ли ваш тест true или false, а затем добавляет описание в элемент списка. Наконец, этот блок кода добавляется на страницу. Его безумный прост, но отлично работает.

Ответ 6

Вот действительно простая реализация функции assert. Это требует значения и описания того, что вы тестируете.

 function assert(value, description) {
        var result = value ? "pass" : "fail";
        console.log(result + ' - ' +  description); 
    };

Если значение принимает значение true, оно проходит.

assert (1===1, 'testing if 1=1');  

Если он возвращает false, он терпит неудачу.

assert (1===2, 'testing if 1=1');

Ответ 7

Вероятно, с библиотекой тестирования, которую использует какой-то ваш код. Вот пример одного (скорее всего, это не та библиотека, которую использует ваш код, но она показывает общую идею):

http://chaijs.com/guide/styles/#assert

Ответ 8

Если утверждение ложно, отображается сообщение. В частности, если первый аргумент является ложным, второй аргумент (строковое сообщение) будет занесен в консоль инструментов разработчика. Если первый аргумент истинен, в принципе ничего не происходит. Простой пример - я использую Google Developer Tools:

var isTrue = true;
var isFalse = false;
console.assert(isTrue, 'Equals true so will NOT log to the console.');
console.assert(isFalse, 'Equals false so WILL log to the console.');

Ответ 9

Предыдущие ответы могут быть улучшены с точки зрения производительности и совместимости.

Проверить один раз, если существует объект Error, если он не объявлен:

if (typeof Error === "undefined") {
    Error = function(message) {
        this.message = message;
    };
    Error.prototype.message = "";
}

Затем каждое утверждение проверяет условие, а всегда бросает объект Error

function assert(condition, message) {
    if (!condition) throw new Error(message || "Assertion failed");
}

Имейте в виду, что консоль не отображает номер строки реальной ошибки, а строку функции assert, которая не подходит для отладки.

Ответ 10

Если вы используете webpack, вы можете просто использовать node.js-библиотеку утверждений. Хотя они утверждают, что он "не предназначен для библиотеки общего назначения", он, кажется, более чем подходит для ad hoc-утверждений, и, похоже, конкурентов нет в пространстве Node (Chai предназначен для модульного тестирования).

const assert = require('assert');
...
assert(jqXHR.status == 201, "create response should be 201");

Вам нужно использовать webpack или браузер, чтобы иметь возможность использовать это, поэтому, очевидно, это полезно, только если они уже находятся в вашем рабочем процессе.

Ответ 11

В дополнение к другим параметрам, например console.assert или переместите свой собственный, вы можете использовать invariant. Он имеет несколько уникальных возможностей:

  • Он поддерживает форматированные сообщения об ошибках (используя спецификатор %s).
  • В производственных средах (как определено средой Node.js или Webpack) сообщение об ошибке является необязательным, что позволяет (немного) меньше .js.