อะไรคือความแตกต่างระหว่างassert
, expect
และshould
, และเมื่อใช้อะไร?
assert.equal(3, '3', '== coerces values to strings');
var foo = 'bar';
expect(foo).to.equal('bar');
foo.should.equal('bar');
อะไรคือความแตกต่างระหว่างassert
, expect
และshould
, และเมื่อใช้อะไร?
assert.equal(3, '3', '== coerces values to strings');
var foo = 'bar';
expect(foo).to.equal('bar');
foo.should.equal('bar');
คำตอบ:
อินเทอร์เฟซทั้งสามนำเสนอสไตล์ที่แตกต่างของการยืนยัน ในที่สุดพวกเขาทำงานเดียวกัน ผู้ใช้บางคนชอบสไตล์หนึ่งมากกว่าอีกสไตล์ สิ่งนี้ถูกกล่าวว่านอกจากนี้ยังมีข้อพิจารณาทางเทคนิคสองประการที่ควรค่าแก่การเน้น:
อินเทอร์เฟซการยืนยันและคาดว่าจะไม่ปรับเปลี่ยนObject.prototype
ในขณะที่ควรทำ Object.prototype
ดังนั้นพวกเขาจึงเป็นทางเลือกที่ดีในสภาพแวดล้อมที่คุณไม่สามารถหรือไม่ต้องการที่จะเปลี่ยนแปลง
อินเทอร์เฟซการยืนยันและคาดหวังสนับสนุนข้อความที่กำหนดเองได้ทุกที่ ตัวอย่างเช่น
assert.isTrue(foo, "foo should be true");
expect(foo, "foo should be true").to.be.true;
ข้อความ "foo ควรเป็นจริง" จะถูกส่งออกพร้อมกับการยืนยันที่ล้มเหลวหากการยืนยันล้มเหลว คุณไม่ได้รับโอกาสตั้งค่าข้อความที่กำหนดเองด้วยอินเทอร์เฟซที่ควร
(บันทึกประวัติ: เป็นเวลานานคำตอบนี้ระบุว่าจะได้รับข้อความที่กำหนดเองด้วยexpect
คุณจะต้องใช้วิธีแก้ปัญหาAurélien Ribonแจ้งให้ฉันทราบว่าการส่งข้อความไปexpect
เป็นพารามิเตอร์ตัวที่สองทำงานดังนั้นจึงไม่จำเป็นต้อง วิธีแก้ปัญหาฉันไม่สามารถค้นหารุ่นของ Mocha ที่เริ่มให้การสนับสนุนข้อความนี้และฉันไม่สามารถค้นหาเอกสารรุ่นที่เป็นเอกสารได้เป็นครั้งแรก)
โปรดทราบว่าassert.isTrue(foo)
, expect(foo).to.be.true
และfoo.should.be.true
การส่งออกต่อไปนี้ทั้งหมดถ้าคุณไม่ได้ใช้ข้อความที่กำหนดเองและfoo === 1
:
AssertionError: expected 1 to be true
ดังนั้นในขณะที่ความคาดหวังและอินเทอร์เฟซควรดีกว่าการอ่านมันไม่เหมือนอินเทอร์เฟซเดียวที่ให้ข้อมูลมากกว่าที่เป็นธรรมชาติเมื่อการยืนยันล้มเหลว ข้อความนี้ซึ่งเป็นเหมือนกันสำหรับทั้งสามอินเตอร์เฟซไม่ได้บอกคุณในสิ่งที่ว่าคุณได้รับการทดสอบเท่านั้นที่คุ้มค่าที่คุณได้เป็นแต่คุณต้องการ1
true
หากคุณต้องการทราบว่าคุณกำลังทดสอบอะไรคุณต้องเพิ่มข้อความ
expect
โดยใช้มอคค่ารุ่นล่าสุด
mocha
และรับความล้มเหลวในการทดสอบ
ฉันหวังว่าตัวอย่างง่ายๆนี้จะทำให้ความแตกต่างชัดเจน
ยืนยัน
var assert = require('chai').assert
, foo = 'bar'
, beverages = { tea: [ 'chai', 'matcha', 'oolong' ] };
assert.typeOf(foo, 'string'); // without optional message
assert.typeOf(foo, 'string', 'foo is a string'); // with optional message
assert.equal(foo, 'bar', 'foo equal `bar`');
assert.lengthOf(foo, 3, 'foo`s value has a length of 3');
assert.lengthOf(beverages.tea, 3, 'beverages has 3 types of tea');
ในทุกกรณีสไตล์การยืนยันอนุญาตให้คุณรวมข้อความเสริมเป็นพารามิเตอร์สุดท้ายในคำสั่ง assert สิ่งเหล่านี้จะรวมอยู่ในข้อความแสดงข้อผิดพลาดหากการยืนยันของคุณไม่ผ่าน
หมายเหตุ คาดหวังและควรใช้ภาษา chainable เพื่อสร้างการยืนยัน แต่แตกต่างกันในวิธีการสร้างการยืนยันในขั้นต้น ในกรณีที่ควรมียังมีบางประการและเครื่องมือเพิ่มเติมเพื่อเอาชนะ caveats
คาดหวัง
var expect = require('chai').expect
, foo = 'bar'
, beverages = { tea: [ 'chai', 'matcha', 'oolong' ] };
expect(foo).to.be.a('string');
expect(foo).to.equal('bar');
expect(foo).to.have.lengthOf(3);
expect(beverages).to.have.property('tea').with.lengthOf(3);
ความคาดหวังช่วยให้คุณสามารถรวมข้อความโดยพลการเพื่อยืนยันล่วงหน้าที่ล้มเหลวที่อาจเกิดขึ้น
var answer = 43;
// AssertionError: expected 43 to equal 42.
expect(answer).to.equal(42);
// AssertionError: topic [answer]: expected 43 to equal 42.
expect(answer, 'topic [answer]').to.equal(42);
สิ่งนี้มีประโยชน์เมื่อใช้กับหัวข้อที่ไม่ใช่คำอธิบายเช่นบูลีนหรือตัวเลข
ควร
รูปแบบควรอนุญาตให้มีการยืนยันโซ่แบบเดียวกับส่วนต่อประสานที่คาดหวังอย่างไรก็ตามจะขยายแต่ละวัตถุด้วยคุณสมบัติที่ควรเริ่มต้นลูกโซ่ของคุณ รูปแบบนี้มีปัญหาบางอย่างเมื่อใช้กับ Internet Explorer ดังนั้นโปรดระวังความเข้ากันได้ของเบราว์เซอร์
var should = require('chai').should() //actually call the function
, foo = 'bar'
, beverages = { tea: [ 'chai', 'matcha', 'oolong' ] };
foo.should.be.a('string');
foo.should.equal('bar');
foo.should.have.lengthOf(3);
beverages.should.have.property('tea').with.lengthOf(3);
ความแตกต่างระหว่างความคาดหวังและควร
ก่อนอื่นให้สังเกตว่าการคาดหวังที่ต้องการเป็นเพียงการอ้างอิงถึงฟังก์ชั่นที่คาดหวังในขณะที่ควรจะต้องมีการดำเนินการฟังก์ชั่น
var chai = require('chai')
, expect = chai.expect
, should = chai.should();
คาดหวังอินเตอร์เฟซที่ให้ฟังก์ชั่นเป็นจุดเริ่มต้นสำหรับการผูกมัดยืนยันภาษาของคุณ มันทำงานบน node.js และในเบราว์เซอร์ทั้งหมด
ควรติดต่อขยาย Object.prototype เพื่อให้ getter เดียวเป็นจุดเริ่มต้นสำหรับการยืนยันภาษาของคุณ มันทำงานบน node.js และในเบราว์เซอร์ที่ทันสมัยทั้งหมดยกเว้น Internet Explorer
expect(foo).to.equal(true, "foo should be true");