อะไรคือความแตกต่างระหว่างการยืนยันคาดหวังและควรอยู่ในชัย


160

อะไรคือความแตกต่างระหว่างassert, expectและshould, และเมื่อใช้อะไร?

assert.equal(3, '3', '== coerces values to strings');

var foo = 'bar';

expect(foo).to.equal('bar');

foo.should.equal('bar');

คำตอบ:


289

ความแตกต่างจะมีเอกสารมี

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

  1. อินเทอร์เฟซการยืนยันและคาดว่าจะไม่ปรับเปลี่ยนObject.prototypeในขณะที่ควรทำ Object.prototypeดังนั้นพวกเขาจึงเป็นทางเลือกที่ดีในสภาพแวดล้อมที่คุณไม่สามารถหรือไม่ต้องการที่จะเปลี่ยนแปลง

  2. อินเทอร์เฟซการยืนยันและคาดหวังสนับสนุนข้อความที่กำหนดเองได้ทุกที่ ตัวอย่างเช่น

    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หากคุณต้องการทราบว่าคุณกำลังทดสอบอะไรคุณต้องเพิ่มข้อความ


8
โปรดทราบว่าคุณยังสามารถทำได้expect(foo).to.equal(true, "foo should be true");
user5325596

ฉันไม่สามารถรับข้อความที่กำหนดเองใด ๆ ได้expectโดยใช้มอคค่ารุ่นล่าสุด
Mirko

@Mirko รุ่นของ Mocha ไม่ใช่สิ่งสำคัญที่นี่ คุณใช้ชัยรุ่นล่าสุดหรือไม่?
Louis

เหมือนกันสำหรับฉันในวานิลลาด่วน (4.16.3), มอคค่า (5.1.1), ชัย (4.1.2), โครงการ chai-http (4.0.0) ข้อความที่กำหนดเองจะไม่ปรากฏที่ใดก็ได้เมื่อรันด้วยคำสั่งmochaและรับความล้มเหลวในการทดสอบ
Juha Untinen

15

ฉันหวังว่าตัวอย่างง่ายๆนี้จะทำให้ความแตกต่างชัดเจน

ยืนยัน

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

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