JavaScript'te “assert” nedir?


263

assertJavaScript'te ne anlama geliyor?

Şuna benzer bir şey gördüm:

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

Ve yöntemin ne yaptığını bilmek istiyorum assert().

Yanıtlar:


367

assertJavaScript'te hiç yok (henüz; bir tane eklemekten bahsediliyor , ancak erken aşamada). Belki de kitaplık sağlayan bir kütüphane kullanıyorsunuzdur. Genel anlamı, işleve iletilen ifade yanlışsa bir hata atmaktır; bu, genel doğrulama kontrolü kavramının bir parçasıdır . Genellikle (isimlendirildikleri gibi) iddialar yalnızca "test" veya "hata ayıklama" derlemelerinde kullanılır ve üretim kodundan çıkarılır.

Her zaman bir dizeyi kabul etmesi gereken bir işleviniz olduğunu varsayalım . Birisinin bu işlevi dize olmayan bir şeyle çağırıp çağırmadığını bilmek istersiniz. Böylece şunları yapabilirsiniz:

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

... assertkoşul yanlış olsaydı burada hata verirdi.

Çok basit bir sürüm şöyle görünecektir:

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

Daha da iyisi, ErrorJavaScript motoru onu destekliyorsa (gerçekten eski olanlar olmayabilir), bu da bir yığın izlemesi toplama avantajına ve benzerlerine sahip olan nesneyi kullanın :

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

IE8 bile Error(özelliğe sahip olmasa da, stackmodern motorlar [modern IE dahil] var).


6
... JS'deki türler hakkında üzülüyor musunuz? Bunun en kötü nedenlerinden biri olduğunu iddia ediyorum assert.
cHao

137
@cHao: Geçerli kullanım örnekleri vardır. Akla ilk gelen örnek buydu. Örnek mesele değil. İddialar kavramı işin özüdür.
TJ Crowder

4
içinde benim kod eklediğim bir şey if(!condition)ayarı var throwError=true;sonra bir debugger;atma bölümü sarın if(throwError). Bu şekilde, hata ayıklayıcı açıksa, kırılacak ve eğer arzu edersem throwErroryanlış olarak ayarlayabilir ve sonra dışarı çıkarken tüm kapsamları inceleyebilirim.
Rick

8
@ Chrome DevTools kullanıyorsanız, Kaynaklar sekmesinde "Yakalanmayan İstisnaları Duraklat" ı etkinleştirmeniz yeterlidir; otomatik olarak throw. Bu şekilde debugger;ifadeye ihtiyacınız yok . Daha fazla bilgi için developer.chrome.com/devtools/docs/… adresine bakın .
Vicky Chijwani

1
@machineghost: Bunun nasıl "daha basit" olduğunu görmüyorum, ifkoşullu bir operatör için işlem gördünüz . Her neyse, bugünün dünyasında, sahip olmayan motorları desteklemeye zahmet etmem Error.
TJ Crowder

157

Modern bir tarayıcı veya düğüm kullanıyorsanız, kullanabilirsiniz console.assert(expression, object).

Daha fazla bilgi için:


46
Bilginize, bu daha çok console.errorkod yürütülmeye devam ettiği gibi davranır .
Daniel Sokolowski

10
@DanielSokolowski, Kesinlikle. console.assertile aynı davranışa sahip olmadığı sürece çok iyi değildir throw.
Pacerier

23
Yürütmenin daha sonra devam etmesinin console.assertnedeni, iddiaların hata işleme işlevleri olmamasıdır. Yalnızca geliştirme sırasında kod doğruluğu kontrolü için tasarlanmıştır. Geleneksel olarak, canlı sistemlerin önemsiz bir şey nedeniyle sona ermesini önlemek için üretim ortamlarında tamamen devre dışı bırakılırlar. Tarayıcı bir üretim ortamı olarak kabul edilir, bu nedenle console.assertburada yürütmeyi sonlandırmaz. Yürütmeyi durdurmak için iddialara güveniyorsanız, bunun yerine doğru iddiaları kullanmalısınız, çünkü iddiaların amacı bu değildir.
Malvineous

8
@RonBurk: Dil tasarımcıları "hangi iddiaların ne anlama geldiğine" karar verdiler. Gelen C ++ [bir onaylama] bir programın ayıklama fazı çıktıktan sonra genellikle devre dışı olduğundan, yakalama programlama hataları değil, kullanıcı veya çalışma zamanı hataları için tasarlanmıştır. PHP , kural olarak, onaylama denetimi etkinleştirilmezse kodunuzun her zaman doğru şekilde çalışabilmesi gerektiğini söylüyor . Pasif ses, kişisel bir tercihe yetki vermek değil, yaygın olarak kabul gören genel uygulamayı rapor etmekti.
Malvineous

4
@Don: Nokta alındı ​​ama ben sadece bağlantılı sayfalardan alıntı yapıyordum. Sadece kod bir gün bunu yapmak güvenli olduğunu düşünen biri tarafından kullanılabilir, çünkü iddialar devre dışı bırakılabilir gibi ele alınması gerektiğini düşünüyorum. İddialar kodunuz için kritik ise, o zaman gerçekten her zaman yürütmeyi sonlandırmak için garanti edilmeyen bir hata ayıklama yöntemine güvenmek yerine uygun hata kontrolüne yükseltilmesi gerektiğini düşünüyorum. Kodunuzun, sadece bir hata döndürüp devam edebileceği bir üretim ortamında tekrar tekrar ölmesinin, değerinden daha fazla strese neden olabileceğinden bahsetmiyoruz!
Malvineous

29

Diğer cevaplar iyidir: ECMAScript5'te yerleşik bir onaylama işlevi yoktur (örneğin temelde her yerde çalışan JavaScript), ancak bazı tarayıcılar size verir veya bu işlevselliği sağlayan eklentilere sahiptir. Bunun için iyi kurulmuş / popüler / bakımlı bir kütüphane kullanmak muhtemelen en iyisi olsa da, akademik amaçlar için "fakir bir adamın iddiası" işlevi şöyle görünebilir:

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, bunu kolayca geliştirme ortamlarında bir hata atacak şekilde değiştirebilir (örneğin, başka bir koşullu eklerse / başka bir koşul ekleyerek) ve aksi takdirde hiçbir şey yapmaz veya yalnızca bir uyarı yazdırır. Şahsen benim görüşüm, iddiaların sadece test kodunda olması gerektiğidir (örneğin beklenen & gerçek sonuçların eşleşip eşleşmediğini kontrol etmek); üretim kodu onlar ya da gereksiz kaldırılması veya yalnızca mantık ve standart dışı durum işleme (örneğin sterilize ile ikame edilmiş olabilir ki bu durumda kullanıcı / harici giriş koruma için bu şekilde (tasarımı ile doğru garanti) ve gereken try, catch, throw)
iX3

8

assert()yerel bir javascript işlevi değildir. Birisinin yaptığı özel bir işlevdir. Bunu sayfanızda veya dosyalarınızda aramalı ve ne yaptığını belirlemeye yardımcı olması için herkesin göndermesini sağlayabilirsiniz.


5

şuna göz at: http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-quick-and-easy-javascript-testing-with-assert/

JavaScript test etmek içindir. Şaşırtıcı bir şekilde, sadece beş veya altı satırda, bu kod test ederken kodunuz üzerinde büyük bir güç ve kontrol seviyesi sağlar.

Assert işlevi iki parametreyi kabul eder:

sonuç: Testinizin başarılı olup olmadığını gösteren bir boolean

açıklama: Testinizin kısa bir açıklaması.

Daha sonra assert işlevi basitçe bir liste öğesi oluşturur, testinizin true veya false olup olmadığına bağlı olarak bir “pass” veya “fail” sınıfı uygular ve ardından açıklamayı liste öğesine ekler. Son olarak, bu kod bloğu sayfaya eklenir. Çok basit, ama mükemmel çalışıyor.


4

İşte bir assert fonksiyonunun gerçekten basit bir uygulaması. Test ettiğiniz şeyin değeri ve açıklaması gerekir.

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

Değer true olarak değerlendirilirse geçer.

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

False değerini döndürürse başarısız olur.

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

1
Bir iddianın amacı stdout'a bilgi düzeyinde giriş yapmak değil, programın yürütülmesini durdurmak (genellikle bir istisna oluşturur) ve iddianın yanlış değerlendirilmesi durumunda stderr'a giriş yapmaktır.
Nuno André

4

Onaylama yanlışsa, mesaj görüntülenir. Özellikle, ilk bağımsız değişken yanlışsa, ikinci bağımsız değişken (dize iletisi) geliştirici araçları konsoluna kaydedilir. İlk argüman doğruysa, temelde hiçbir şey olmaz. Basit bir örnek - Google Geliştirici Araçları kullanıyorum:

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


2

Kelime veya işlev "assert" çoğunlukla uygulamanın parçalarının test edilmesinde kullanılır.

Onaylama işlevleri, programa koşulu ("onaylama" olarak da adlandırılır) kontrol etmesini bildirmenin kısa bir yoludur ve koşul Doğru değilse hata atar.

Şimdi "normal kod" da nasıl görüneceğini görelim

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

İle assertyazabilirsiniz:

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

Javascript'te yerel dil yok assert işlev , bu nedenle bazı kütüphanelerden birini kullanmanız gerekir.

Basit bir giriş için bu makaleyi kontrol edebilirsiniz:

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

Umut ediyorum bu yardım eder.


2

Birinci öznitelik yanlışsa, ikinci öznitelik atılacak mesaj ise onaylama hata iletisi atar.

console.assert(condition,message);

JavaScript'te iddianın mevcut olmadığını ancak JavaScript'te console.assert()iddi fonksiyonunun olduğunu söyleyen birçok yorum var . İddia fikri, hatanın neden / nerede oluştuğunu bulmaktır.

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

Burada mesaja bağlı olarak hatanın ne olduğunu bulabilirsiniz. Bu hata mesajları, konsolda console.error();
daha fazla işlev görmek için çağırdığımız gibi kırmızı renkte konsolda görüntülenecektirconsole.log(console);


1

Önceki cevaplar performanslar ve uyumluluk açısından geliştirilebilir.

Kontrol kez eğer Errorbeyan değilse, nesne var:

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

Ardından, her iddia durumu kontrol eder ve her zaman bir Errornesne atar

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

Konsolun gerçek hata satırı numarasını değil, ekranın satırını assert değil, hata ayıklama için kullanışlı olmayan fonksiyon unutmayın.


1

Webpack kullanıyorsanız, sadece node.js onaylama kütüphanesini kullanabilirsiniz . Her ne kadar "genel amaçlı bir iddia kütüphanesi olması amaçlanmadığını" iddia etseler de, ad hoc iddiaları için OK'den daha fazlası gibi görünüyor ve Düğüm alanında zaten bir rakip yok gibi görünüyor (Chai birim testi için tasarlanmıştır).

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

Bunu kullanabilmek için webpack veya browserify kullanmanız gerekir, bu yüzden bu sadece iş akışınızda zaten varsa yararlıdır.


1

Console.assert veya kendi yuvarlama gibi diğer seçeneklere ek olarak , değişmez kullanabilirsiniz . Birkaç benzersiz özelliği vardır:

  • Biçimlendirilmiş hata mesajlarını destekler ( %s belirteç ).
  • Üretim ortamlarında (Node.js veya Webpack ortamı tarafından belirlendiği gibi), hata iletisi isteğe bağlıdır ve (biraz) daha küçük .js'ye izin verir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.