ฉันพบว่า "วิธีแก้ปัญหา" ของการเพิ่มระยะเวลาทำให้ชัดเจนว่าเกิดอะไรขึ้นที่นี่ซึ่งก็คือ
- การเรียกใช้รหัสและ / หรือเครือข่ายของคุณช้าเกินไป (ควรต่ำกว่า 100 ms เพื่อประสบการณ์การใช้งานที่ดี)
- การยืนยัน (การทดสอบ) ล้มเหลวและมีบางอย่างกลืนความผิดพลาดก่อนที่มอคค่าจะสามารถดำเนินการกับพวกเขาได้
คุณมักจะพบ # 2 เมื่อ Mocha ไม่ได้รับข้อผิดพลาดในการยืนยันจากการโทรกลับ นี่คือสาเหตุที่เกิดจากรหัสอื่น ๆ กลืนข้อยกเว้นขึ้นสแต็ค วิธีการที่เหมาะสมในการจัดการกับเรื่องนี้คือการแก้ไขรหัสและไม่กลืนข้อผิดพลาด
เมื่อรหัสภายนอกกลืนข้อผิดพลาดของคุณ
ในกรณีที่เป็นฟังก์ชั่นห้องสมุดที่คุณไม่สามารถแก้ไขได้คุณจะต้องตรวจสอบข้อผิดพลาดในการยืนยันและส่งต่อไปยัง Mocha ด้วยตัวคุณเอง คุณทำสิ่งนี้ด้วยการตัดการเรียกกลับยืนยันในบล็อกลอง / จับและส่งข้อยกเว้นใด ๆ ไปยังตัวจัดการที่ทำ
it('should not fail', function (done) { // Pass reference here!
  i_swallow_errors(function (err, result) {
    try { // boilerplate to be able to get the assert failures
      assert.ok(true);
      assert.equal(result, 'bar');
      done();
    } catch (error) {
      done(error);
    }
  });
});
แน่นอนสามารถสกัดแผ่นสำเร็จรูปนี้ไปยังฟังก์ชั่นยูทิลิตี้บางอย่างเพื่อให้การทดสอบดีขึ้น:
it('should not fail', function (done) { // Pass reference here!
    i_swallow_errors(handleError(done, function (err, result) {
        assert.equal(result, 'bar');
    }));
});
// reusable boilerplate to be able to get the assert failures
function handleError(done, fn) {
    try { 
        fn();
        done();
    } catch (error) {
        done(error);
    }
}
เร่งการทดสอบเครือข่าย
นอกเหนือจากนั้นฉันขอแนะนำให้คุณรับคำแนะนำในการเริ่มใช้สตับสำหรับการโทรผ่านเครือข่ายเพื่อทำการทดสอบผ่านโดยไม่ต้องพึ่งพาเครือข่ายที่ใช้งานได้ การใช้มอคค่าชัยและ Sinon การทดสอบอาจมีลักษณะเช่นนี้
describe('api tests normally involving network calls', function() {
    beforeEach: function () {
        this.xhr = sinon.useFakeXMLHttpRequest();
        var requests = this.requests = [];
        this.xhr.onCreate = function (xhr) {
            requests.push(xhr);
        };
    },
    afterEach: function () {
        this.xhr.restore();
    }
    it("should fetch comments from server", function () {
        var callback = sinon.spy();
        myLib.getCommentsFor("/some/article", callback);
        assertEquals(1, this.requests.length);
        this.requests[0].respond(200, { "Content-Type": "application/json" },
                                 '[{ "id": 12, "comment": "Hey there" }]');
        expect(callback.calledWith([{ id: 12, comment: "Hey there" }])).to.be.true;
    });
});
ดูเอกสารเพิ่มเติมของ Sinonniseสำหรับข้อมูลเพิ่มเติม