"ยืนยัน" ใน JavaScript คืออะไร?


263

อะไรassertหมายถึงใน JavaScript?

ฉันเคยเห็นบางสิ่งเช่น:

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

และต้องการทราบว่าวิธีการassert()ทำ

คำตอบ:


367

ไม่มีassertใน JavaScript (ยังมีการพูดของการเพิ่มแต่มันอยู่ในช่วงเริ่มต้น) บางทีคุณอาจใช้ห้องสมุดที่ให้บริการ ความหมายปกติคือการโยนข้อผิดพลาดหากการแสดงออกผ่านเข้าไปในฟังก์ชั่นเป็นเท็จ นี้เป็นส่วนหนึ่งของแนวคิดทั่วไปของการตรวจสอบยืนยัน โดยทั่วไปแล้วการยืนยัน (ตามที่เรียกว่า) จะใช้เฉพาะใน "การทดสอบ" หรือ "การแก้ปัญหา" การสร้างและแยกออกจากรหัสการผลิต

สมมติว่าคุณมีฟังก์ชันที่ควรจะยอมรับสตริงเสมอ คุณต้องการที่จะรู้ว่าถ้ามีคนเรียกฟังก์ชั่นนั้นกับสิ่งที่ไม่ใช่สตริง ดังนั้นคุณอาจทำ:

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คุณสมบัติ แต่มีเอ็นจิ้นที่ทันสมัย


6
... ได้รับ uppity เกี่ยวกับประเภทใน JS? assertผมขอยืนยันว่าเป็นหนึ่งในเหตุผลที่เลวร้ายที่สุดไป
cHao

137
@cHao: มีกรณีการใช้ที่ถูกต้อง มันเป็นเพียงตัวอย่างแรกที่นึกขึ้นมาได้ ตัวอย่างไม่ได้เป็นจุด แนวคิดของการยืนยันเป็นจุด
TJ Crowder

4
สิ่งที่ฉันได้เพิ่มเข้าไปในรหัสของฉันภายในif(!condition)คือการตั้งค่าvar throwError=true;แล้วแล้วห่อส่วนจากเส้นข้างในdebugger; if(throwError)ด้วยวิธีนี้ถ้าฉันเปิดดีบักเกอร์มันจะพังและถ้าฉันปรารถนาที่จะตั้งค่าthrowErrorเป็นเท็จจากนั้นตรวจสอบขอบเขตทั้งหมดในขณะที่ก้าวออกไป
Rick

8
@Rick ถ้าคุณใช้ Chrome DevTools คุณก็สามารถเปิดใช้งาน "หยุดชั่วคราวในข้อยกเว้น Uncaught" throwในแหล่งที่มาของแท็บโดยอัตโนมัติและจะทำลายที่ ด้วยวิธีนี้คุณไม่จำเป็นต้องมีdebugger;คำสั่ง ดูdeveloper.chrome.com/devtools/docs/…สำหรับข้อมูลเพิ่มเติม
Vicky Chijwani

1
@machineghost: ฉันไม่เห็นว่ามันเป็น "ง่ายกว่า" คุณแค่แลกifกับโอเปอเรเตอร์ที่มีเงื่อนไข Errorอย่างไรก็ตามในโลกของวันนี้ฉันจะไม่รำคาญที่จะสนับสนุนเครื่องมือที่ไม่ได้มี
TJ Crowder

157

หากใช้เบราว์เซอร์ที่ทันสมัยหรือ nodejs console.assert(expression, object)คุณสามารถใช้

สำหรับข้อมูลเพิ่มเติม:


46
ในปีนี้จะทำหน้าที่เหมือนconsole.errorในรหัสที่ยังดำเนินการอยู่
Daniel Sokolowski

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()ไม่ใช่ฟังก์ชันจาวาสคริปต์ดั้งเดิม มันเป็นฟังก์ชั่นที่กำหนดเองที่ใครบางคนทำ คุณจะต้องมองหามันบนหน้าของคุณหรือในไฟล์ของคุณและโพสต์มันให้ใครก็ได้เพื่อช่วยตัดสินว่ามันทำอะไรอยู่


5

ตรวจสอบสิ่งนี้: http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-quick-and-easy-javascript-testing-with-assert/

มันมีไว้สำหรับทดสอบ JavaScript น่าอัศจรรย์ที่แทบจะไม่ห้าหรือหกบรรทัดโค้ดนี้ให้ระดับพลังที่ยอดเยี่ยมและควบคุมรหัสของคุณเมื่อทำการทดสอบ

ฟังก์ชัน assert ยอมรับพารามิเตอร์สองตัว:

ผลลัพธ์: บูลีนซึ่งอ้างอิงว่าการทดสอบของคุณผ่านหรือไม่

คำอธิบาย: คำอธิบายสั้น ๆ ของการทดสอบของคุณ

ฟังก์ชั่นยืนยันนั้นเพียงสร้างรายการรายการใช้คลาส“ ผ่าน” หรือ“ ล้มเหลว” ขึ้นอยู่กับว่าการทดสอบของคุณคืนค่าเป็นจริงหรือเท็จจากนั้นผนวกคำอธิบายต่อท้ายรายการ ในที่สุดบล็อกของการเข้ารหัสนั้นจะถูกเพิ่มไปยังหน้า มันง่ายมาก แต่ทำงานได้อย่างสมบูรณ์


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 หากการยืนยันนั้นมีการประเมินที่ผิดพลาด
Nuno André

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

คำหรือฟังก์ชัน "ยืนยัน" ส่วนใหญ่จะใช้ในการทดสอบส่วนต่าง ๆ ของแอปพลิเคชัน

ฟังก์ชั่นยืนยันเป็นวิธีสั้น ๆ ในการสั่งให้โปรแกรมตรวจสอบสภาพ (หรือที่เรียกว่า "การยืนยัน") และหากเงื่อนไขไม่เป็นจริงมันจะโยนข้อผิดพลาด

ดังนั้นเรามาดูกันว่ามันจะมีลักษณะอย่างไรใน "รหัสปกติ"

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");

คุณต้องใช้ webpack หรือ browserify เพื่อให้สามารถใช้งานได้ดังนั้นจึงเห็นได้ชัดว่านี่จะมีประโยชน์ก็ต่อเมื่อสิ่งเหล่านั้นอยู่ในเวิร์กโฟลว์ของคุณแล้ว


1

นอกเหนือจากตัวเลือกอื่น ๆ เช่นconsole.assertหรือกลิ้งของคุณเองคุณสามารถใช้ค่าคงที่ มันมีคุณสมบัติพิเศษสองอย่าง:

  • รองรับข้อความแสดงข้อผิดพลาดที่จัดรูปแบบ (โดยใช้ %sระบุ)
  • ในสภาพแวดล้อมการใช้งานจริง (ตามที่กำหนดโดย Node.js หรือสภาพแวดล้อม Webpack) ข้อความแสดงข้อผิดพลาดเป็นทางเลือกช่วยให้. js มีขนาดเล็กลงเล็กน้อย

0

ตามที่ TJ กล่าวถึงไม่มีassertใน JavaScript แต่มีโมดูลโหนดชื่อยืนยันซึ่งเป็นส่วนใหญ่จะใช้สำหรับการทดสอบ ดังนั้นคุณอาจเห็นรหัสเช่น:

const assert = require('assert');
assert(5 > 7);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.