Що таке "стверджувати" в JavaScript?


263

Що assertозначає JavaScript?

Я бачив щось на кшталт:

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

І хотілося б знати, що assert()робить метод .

Відповіді:


367

У assertJavaScript немає (поки що, йдеться про додавання його , але це на ранній стадії). Можливо, ви використовуєте бібліотеку, яка надає цю бібліотеку. Звичайний сенс - помилка, якщо вираз, переданий у функцію, помилковий; це частина загальної концепції перевірки тверджень . Зазвичай твердження (як їх називають) використовуються лише для складання "тестування" чи "налагодження" та позбавлені виробничого коду.

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

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]).


6
... отримує стурбованість щодо типів у JS? Я б сказав, що це одна з найгірших причин assert.
cHao

137
@cHao: Існують дійсні випадки використання. Це був лише перший приклад, який прийшов до тями. Приклад не в тому. Концепція тверджень - суть.
TJ Crowder

4
щось, що я додав до свого коду всередині, - if(!condition)це налаштування, var throwError=true;а debugger;потім оберніть розділ кидка в if(throwError). Таким чином, якщо я відкрию налагоджувач, він зламається, і якщо я цього хочу, я можу встановити throwErrorзначення false, а потім вивчити всі сфери застосування під час виходу.
Рік

8
@Rick, якщо ви використовуєте Chrome DevTools, ви можете просто включити "Призупинити вимкнено винятки" на вкладці "Джерела", і він автоматично порушиться на throw. Таким чином, debugger;заява вам не потрібна . Докладнішу інформацію див. У розділі developer.chrome.com/devtools/docs/… .
Vicky Chijwani

1
@machineghost: Я не бачу, наскільки це "простіше", ви щойно торгували ifза умовного оператора. Як би там не було, я б не намагався підтримувати двигуни, яких немає Error.
TJ Crowder

157

Якщо ви використовуєте сучасний браузер або nodejs, ви можете використовувати console.assert(expression, object).

Для отримання додаткової інформації:


46
FYI, це діє так console.error, як код продовжує виконувати.
Даніель Соколовський

10
@DanielSokolowski, Точно. console.assertне так добре, якщо вона не має таку саму поведінку, як throw.
Pacerier

23
Причина виконання продовжується console.assertі тому, що твердження не є функціями обробки помилок. Вони призначені для перевірки правильності коду під час розробки. Традиційно вони повністю відключені у виробничих середовищах, щоб уникнути завершення роботи живих систем через щось тривіальне. Веб-переглядач вважається виробничим середовищем, тому console.assertйого виконання не припиняється. Якщо ви спираєтесь на твердження, щоб зупинити виконання, тоді вам слід використовувати правильну обробку помилок, оскільки це не те, для чого твердження призначені.
Malvineous

8
@RonBurk: Мовні дизайнери вирішили "для чого призначені твердження". У C ++ [твердження] призначений для збору помилок програмування, а не помилок користувача або часу виконання, оскільки він, як правило, відключається після того, як програма закінчує свою фазу налагодження. PHP каже, що, як правило, ваш код повинен завжди мати можливість працювати правильно, якщо перевірка тверджень не активована. Пасивний голос мав на меті не надавати повноважень на особисті переваги, а скоріше повідомляти про загальноприйняту загальну практику.
Malvineous

4
@Don: Точка прийнята, але я просто цитував із пов'язаних сторінок. Я вважаю, що до тверджень слід ставитися так, ніби вони можуть бути відключені, хоча б тому, що ваш день може бути використаний тим, хто вважає це безпечним. Якщо твердження є критичними для вашого коду, то, я думаю, їх дійсно слід покращити до правильної перевірки помилок, а не покладатися на метод налагодження, який не завжди гарантовано припиняє виконання. Не кажучи вже про те, що те, що ваш код неодноразово гине у виробничих умовах, коли він може просто повернути помилку і продовжувати, може спричинити більший стрес, ніж це варто!
Malvineous

29

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

const assert = function(condition, message) {
    if (!condition)
        throw Error('Assert failed: ' + (message || ''));
};

assert(1 === 1); // Executes without problem
assert(false, 'Expected true');
// Yields 'Error: Assert failed: Expected true' in console


BTW, можна було легко змінити це так, що воно видає лише помилку в середовищі розробки (наприклад, загортання в інше, якщо / додавання іншого умовного) і в іншому випадку не робить нічого або лише друкує попередження. Особисто я вважаю, що твердження повинні бути лише в тестовому коді (наприклад, перевірка відповідності очікуваних та фактичних результатів); в робочому коді вони повинні бути або зайвим (гарантується правильна по конструкції) , і , таким чином , видалені або тільки для охорони користувача / зовнішній вхід , в цьому випадку вони можуть бути замінені на дезинфікуючого логіку & стандартну обробку виняткових ситуацій (наприклад try, catch, throw)
ix3

8

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


5

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

це для тестування JavaScript. Дивовижно, що, ледь п’ять чи шість рядків, цей код забезпечує великий рівень потужності та контролю над вашим кодом під час тестування.

Функція затвердження приймає два параметри:

результат: Булевий, який посилається на те, пройшов ваш тест чи провалився

Опис: Короткий опис вашого тесту.

Потім функція затвердження просто створює елемент списку, застосовує клас або "пройти", або "провалити", залежно від того, повернувся ваш тест істинним або хибним, а потім додає опис до елемента списку. Нарешті, цей кодований блок додається на сторінку. Це божевільно просто, але працює чудово.


4

Ось дійсно проста реалізація функції затвердження. Він займає значення та опис того, що ви тестуєте.

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

Якщо значення оцінюється як істинне, воно передається.

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

Якщо вона повертається помилковою, вона не працює.

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

1
Мета твердження полягає не в тому, щоб увійти до stdout на рівні інформації, а зупинити виконання програми (як правило, підняття винятку) та ввійти до stderr, якщо твердження оцінено як хибне.
Нуно Андре

4

Якщо твердження помилкове, відображається повідомлення. Зокрема, якщо перший аргумент помилковий, другий аргумент (рядкове повідомлення) буде записаний у консоль інструментів розробника. Якщо перший аргумент правдивий, в основному нічого не відбувається. Простий приклад - я використовую Інструменти для розробників Google:

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.');

3

Ймовірно, у комплекті з бібліотекою для тестування, яка використовується деяким кодом. Ось приклад одного (швидше за все, це не та сама бібліотека, якою використовується ваш код, але вона показує загальну ідею):

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


2

Слово або функція "стверджувати" в основному використовується при тестуванні частин програми.

Функції Assert - це короткий спосіб доручити програмі перевірити стан (також званий "твердження"), і якщо умова не відповідає дійсності, вона призведе до помилки.

Тож давайте подивимось, як це виглядатиме у "звичайному коді"

if (typeof "string" === "array") { throw Error('Error: "string" !== "array"'); }

З assertвами можна просто написати:

assert(typeof "string" === "array")

У Javascript немає вбудованої assertфункції, тому вам доведеться використовувати її з якоїсь бібліотеки.

Для простого вступу ви можете перевірити цю статтю:

http://fredkschott.com/post/2014/05/nodejs-testing-essentials/

Я сподіваюся, що це допомагає.


2

Твердження видає повідомлення про помилку, якщо перший атрибут помилковий, а другий атрибут - це повідомлення, яке потрібно викинути.

console.assert(condition,message);

Є багато коментарів, які стверджують, що твердження не існує в JavaScript, але console.assert()це функція затвердження в JavaScript. Ідея твердження полягає в тому, щоб знайти, чому / де виникає помилка.

console.assert(document.getElementById("title"), "You have no element with ID 'title'");
console.assert(document.getElementById("image"), "You have no element with ID 'image'");

Тут залежно від повідомлення ви можете знайти, що таке помилка. Ці повідомлення про помилки відображатимуться на консолі червоного кольору, як якщо б ми покликали console.error();
Щоб побачити більше функцій у виконанні консоліconsole.log(console);


1

Попередні відповіді можна покращити з точки зору продуктивності та сумісності.

Перевірте один раз, чи 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функції, яка не корисна для налагодження.


1

Якщо ви використовуєте Webpack, ви можете просто використовувати Node.js бібліотеку затвердження . Хоча вони стверджують, що "не призначена бути бібліотекою тверджень загального призначення", схоже, це є більш ніж нормальним для спеціальних тверджень, і, здається, жодного конкурента в просторі Вузла немає (Чай призначений для тестування одиниць).

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

Вам потрібно скористатися вебпакетом або переглядати веб-переглядач, щоб мати можливість використовувати це, тому очевидно, це корисно лише тоді, коли вони вже є у вашому робочому процесі.


1

Крім інших варіантів, таких як console.assert або прокатка власних , ви можете використовувати інваріант . У ньому є кілька унікальних особливостей:

  • Він підтримує відформатовані повідомлення про помилки (за допомогою %sспецифікатора).
  • У виробничих середовищах (як визначено середовищем Node.js або Webpack) повідомлення про помилку є необов'язковим, що дозволяє (трохи) менше .js.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.