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