หากคุณต้องการที่จะรวมหลาย ๆ โมดูลเข้าของคุณdescribe
ลำดับชั้นเหมือนที่คุณกำลังทำอยู่ในคำถามของคุณสิ่งที่คุณกำลังทำสวยมากมันถ้าคุณต้องการที่จะเขียนโหลดการทดสอบที่กำหนดเองสำหรับมอคค่า การเขียน Custom loader จะไม่ง่ายกว่าหรือทำให้โค้ดของคุณชัดเจนไปกว่าสิ่งที่คุณมีอยู่แล้ว
นี่คือตัวอย่างของวิธีที่ฉันจะเปลี่ยนบางสิ่ง test
ไดเรกทอรีย่อยในตัวอย่างนี้จะจัดเป็น:
.
└── test
├── a
│ └── a.js
├── b
│ └── b.js
├── common.js
└── top.js
top.js
:
function importTest(name, path) {
describe(name, function () {
require(path);
});
}
var common = require("./common");
describe("top", function () {
beforeEach(function () {
console.log("running something before each test");
});
importTest("a", './a/a');
importTest("b", './b/b');
after(function () {
console.log("after all tests");
});
});
importTest
ฟังก์ชั่นเป็นเพียงการแสดงให้เห็นว่ามันจะเป็นไปได้ที่จะจัดการกับการทำซ้ำของการนำเข้าโมดูลหลายโดยไม่ต้องพิมพ์ทั้งdescribe(... require...
สิ่งที่ทุกเวลาเดียว common
โมดูลจะหมายถึงการถือสิ่งที่คุณต้องการที่จะใช้ในหลายโมดูลของชุดทดสอบ ฉันไม่ได้ใช้มันจริง ๆtop
แต่สามารถใช้ที่นั่นได้ถ้าจำเป็น
ผมจะทราบที่นี่ว่าbeforeEach
จะเรียกใช้รหัสก่อนที่แต่ละคนและทุกทดสอบเดียวที่ลงทะเบียนกับit
ว่าพวกเขาปรากฏอยู่ภายในdescribe
ในtop
หรือพวกเขาปรากฏในใด ๆ ของโมดูลที่นำเข้า ด้วย--recursive
ที่beforeEach
รหัสจะต้องมีการคัดลอกลงในแต่ละโมดูลหรือบางทีคุณอาจต้องการมีbeforeEach
ตะขอในแต่ละโมดูลที่เรียกฟังก์ชั่นที่นำเข้าจากโมดูลที่พบบ่อย
นอกจากนี้after
เบ็ดจะทำงานหลังจากการทดสอบทั้งหมดในชุด --recursive
นี้ไม่สามารถจำลองแบบด้วย หากคุณใช้--recursive
และเพิ่มรหัสของafter
แต่ละโมดูลจะมีการดำเนินการหนึ่งครั้งต่อโมดูลแทนที่จะใช้เพียงครั้งเดียวสำหรับการทดสอบทั้งหมด
มีการทดสอบทั้งหมดปรากฏอยู่ภายใต้เดียวหัวไม่สามารถจำลองแบบโดยใช้top
--recursive
ด้วย--recursive
แต่ละไฟล์อาจมีdescribe("top"
แต่จะสร้างใหม่top
หัวข้อสำหรับแต่ละไฟล์
common.js
:
var chai = require("chai");
var options = {
foo: "foo"
};
exports.options = options;
exports.chai = chai;
exports.assert = chai.assert;
การใช้โมดูลที่มีชื่อcommon
เช่นนี้เป็นสิ่งที่ฉันได้ทำในชุดทดสอบของฉันเพื่อหลีกเลี่ยงไม่ให้require
มีสิ่งต่างๆมากมายซ้ำแล้วซ้ำเล่าและเพื่อเก็บตัวแปรหรือฟังก์ชันแบบอ่านอย่างเดียวทั่วโลกที่ไม่รักษาสถานะ ฉันไม่ต้องการที่จะสร้างมลพิษให้กับglobal
วัตถุเหมือนในคำตอบของ thgaskell เพราะวัตถุนี้สามารถเข้าถึงได้ทั่วโลกและสามารถเข้าถึงได้แม้ในไลบรารีของบุคคลที่สามโค้ดของคุณอาจกำลังโหลด นี่ไม่ใช่สิ่งที่ฉันยอมรับได้ในรหัสของฉัน
a/a.js
:
var common = require("../common");
var options = common.options;
var assert = common.assert;
it("blah a", function () {
console.log(options.foo);
assert.isTrue(false);
});
b/b.js
:
it("blah b", function () {});