JavaScriptの「アサート」とは何ですか?


263

assertJavaScript とはどういう意味ですか?

私は次のようなものを見ました:

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

そして、メソッドassert()が何をするのか知りたいです。

回答:


367

assertJavaScriptにはありません(まだ、1つ追加するという話がありますが、それは初期段階です)。おそらく、ライブラリを提供するライブラリを使用しています。通常の意味は、関数に渡された式がfalseの場合にエラーをスローすることです。これは、アサーションチェックの一般的な概念の一部です。通常、アサーション(呼び出される)は「テスト」または「デバッグ」ビルドでのみ使用され、本番コードから削除されます。

常に文字列を受け入れることになっている関数があるとします。文字列ではないもので誰かがその関数を呼び出したかどうかを知りたいでしょう。だからあなたはそうするかもしれません:

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にもありますErrorstackプロパティはありませんが、最新のエンジン(最新のIEを含む)にはあります)。


6
... JSの型について気を使いますか?それが最悪の理由の1つだと私は主張しassertます。
cHao

137
@cHao:有効なユースケースがあります。頭に浮かんだ最初の例にすぎません。例は重要ではありません。アサーションの概念がポイントです。
TJクラウダー2013年

4
内側に私は自分のコードに追加したことを何かif(!condition)に設定されvar throwError=true;、その後debugger;、その後にスローセクションを包みますif(throwError)。このようにして、デバッガーを開いている場合はデバッガーが壊れ、必要に応じthrowErrorてfalseに設定して、ステップアウト中にすべてのスコープを調べることができます。
リック

8
@RickでChrome DevToolsを使用している場合は、[Sources]タブで[Pause on Uncaught Exceptions]を有効にするだけで、で自動的に中断されますthrow。そうすれば、debugger;ステートメントは必要ありません。詳細については、developer.chrome.com / devtools / docs / をご覧ください。
Vicky Chijwani

1
@machineghost:if条件付き演算子と交換したばかりの「もっと単純」だとは思いません。とにかく、今日の世界では、を持たないエンジンをサポートする気になりませんError
TJクラウダー

157

最新のブラウザまたはnodejsを使用してconsole.assert(expression, object)いる場合は、を使用できます。

詳細については:


46
ちなみに、これはconsole.error、コードが実行を継続するという点でより似ています。
Daniel Sokolowski、2014年

10
@DanielSokolowski、その通り。console.assertと同じ動作をしない限り、これはあまり良くありませんthrow
Pacerier

23
console.assertアサーションはエラー処理関数ではないため、実行が継続するのは理由です。これらは、開発中のみのコードの正当性チェック用に設計されています。通常、これらは運用環境では完全に無効になっていて、些細なことが原因でライブシステムが終了するのを防ぎます。ブラウザーは実稼働環境と見なされるため、console.assertそこで実行を終了することはありません。実行を停止するためにアサーションに依存している場合は、代わりに適切なエラー処理を使用する必要があります。これはアサーションの目的ではないためです。
Malvineous

8
@RonBurk:言語設計者は「アサーションの意味」を決定しました。ではC ++ プログラムがデバッグ段階を出た後、それが一般的に無効になっているので、[主張]は、キャプチャプログラミングエラーではなく、ユーザーまたは実行時エラーが発生するように設計されています。 PHPによると、経験則として、アサーションチェックがアクティブ化されていない場合、コードは常に正しく機能する必要があります。受動態は、個人的な好みに権限を与えることを意図したものではなく、広く一般に受け入れられている慣行を報告することを意図したものです。
Malvineous 2017年

4
@ドン:ポイントが取られたが、私はリンクされたページからただ引用していた。私は、アサーションは無効にできるかのように扱われるべきだと思います。それは、コードがいつの日か安全であると考える誰かによって使用される可能性があるからです。アサーションがコードにとって重要な場合は、実行の終了が常に保証されているわけではないデバッグメソッドに依存するのではなく、アサーションを実際に適切なエラーチェックにアップグレードする必要があると思います。言うまでもなく、エラーが返されて継続する可能性があるときに、本番環境でコードが繰り返し死ぬことは、価値よりも大きなストレスを引き起こす可能性があります。
Malvineous 2017

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


ところで、これを簡単に変更して、開発環境でエラーをスローするだけです(たとえば、別の条件付きの場合にラップすることによって)。それ以外の場合は何もしないか、警告のみを出力します。個人的には、アサーションはテストコードにのみ含める必要があると考えています(例:期待される結果と実際の結果が一致するかどうかの確認)。生産コードでは、それらはいずれか(デザインにより正しい保証)余計なので、削除または彼らだけがロジック&(例えばハンドリング標準の例外を消毒に置き換えることができ、その場合には、ユーザ/外部入力を守るためにあるべきtrycatchthrow
IX3

8

assert()ネイティブのJavaScript関数ではありません。誰かが作ったカスタム機能です。あなたはそれをあなたのページまたはあなたのファイルで探し、誰もがそれが何をしているかを判断するのを助けるためにそれを投稿する必要があります。


5

これを確認してください:http : //net.tutsplus.com/tutorials/javascript-ajax/quick-tip-quick-and-easy-javascript-testing-with-assert/

JavaScriptのテスト用です。驚くべきことに、このコードはわずか5〜6行で、テスト時にコードに対して優れたレベルのパワーと制御を提供します。

assert関数は2つのパラメーターを受け入れます。

結果:ブール値。テストが成功したか失敗したかを参照します

description:テストの短い説明。

次に、assert関数は単にリストアイテムを作成し、テストがtrueまたはfalseのどちらを返したかに応じて、「合格」または「不合格」のいずれかのクラスを適用し、リストアイテムに説明を追加します。最後に、そのコード化されたブロックがページに追加されます。とてもシンプルですが、完璧に動作します。


4

これは、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');

1
アサーションの目的は、情報レベルでstdoutにログを記録することではなく、プログラムの実行を停止して(通常は例外を発生させる)、アサーションがfalseと評価された場合にstderrにログを記録することです。
ヌーノ・アンドレ

4

アサーションがfalseの場合、メッセージが表示されます。具体的には、最初の引数がfalseの場合、2番目の引数(文字列メッセージ)が開発者ツールコンソールに記録されます。最初の引数がtrueの場合、基本的に何も起こりません。簡単な例–私は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.');

3

おそらく、コードの一部が使用しているテストライブラリが付属しています。これは1つの例です(コードが使用しているライブラリと同じではない可能性がありますが、一般的な考え方を示しています)。

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


2

単語または関数「assert」は、アプリケーションの一部のテストで主に使用されます。

アサート関数は、プログラムに条件( "アサーション"とも呼ばれます)を確認するように指示する簡単な方法であり、条件がTrueでない場合、エラーをスローします。

それでは、「通常のコード」でどのように見えるかを見てみましょう

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

最初の属性がfalseで、2番目の属性がスローされるメッセージである場合、アサーションはエラーメッセージをスローします。

console.assert(condition,message);

JavaScriptにはアサーションは存在しないが、JavaScript console.assert()のアサート関数であるというコメントがたくさんあります。アサーションのアイデアは、バグが発生した理由/場所を見つけることです。

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アサーションライブラリを使用できます。「汎用のアサーションライブラリを意図したものではない」と彼らは主張しているが、アドホックアサーションには問題ないと思われ、いずれにせよノードスペースに競合他社は存在しないようです(Chaiはユニットテスト用に設計されています)。

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

これを使用できるようにするには、webpackまたはbrowserifyを使用する必要があります。そのため、これは、ワークフローにすでに含まれている場合にのみ役立ちます。


1

console.assert独自のロールなどの他のオプションに加えて、インバリアントを使用できます。いくつかのユニークな機能があります:

  • フォーマットされたエラーメッセージをサポートします(%s指定子を使用)。
  • (Node.jsまたはWebpack環境によって決定される)実稼働環境では、エラーメッセージはオプションであり、(わずかに)小さい.jsを許可します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.