Nếu bạn muốn bao gồm nhiều mô-đun vào bạn describephân cấp như bạn đang làm trong câu hỏi của bạn, những gì bạn đang làm là khá nhiều nó , trừ khi bạn muốn viết một bộ nạp kiểm tra tùy chỉnh cho Mocha. Viết trình tải tùy chỉnh sẽ không dễ dàng hơn hoặc làm cho mã của bạn rõ ràng hơn những gì bạn đã có.
Đây là một ví dụ về cách tôi sẽ thay đổi một vài thứ. Thư testmục con trong ví dụ này được tổ chức như sau:
.
└── 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");
});
});
Các importTestchức năng là chỉ để cho thấy làm thế nào nó sẽ có thể để xử lý sự lặp lại của nhập khẩu nhiều mô-đun mà không cần phải gõ lại toàn bộ describe(... require...điều mỗi lần duy nhất. Các commonmô-đun có nghĩa là để giữ những gì bạn cần để sử dụng trong nhiều mô-đun của bộ ứng dụng thử nghiệm. Tôi không thực sự sử dụng nó trong topnhưng nó có thể được sử dụng ở đó, nếu cần.
Tôi sẽ lưu ý ở đây rằng beforeEachsẽ chạy mã của nó trước mỗi và mọi thử nghiệm đơn lẻ được đăng ký với itviệc chúng xuất hiện bên describetrong tophoặc chúng xuất hiện trong bất kỳ mô-đun nào được nhập . Với --recursive, beforeEachmã sẽ phải được sao chép vào từng mô-đun hoặc có lẽ bạn sẽ có một beforeEachhook trong mỗi mô-đun gọi một hàm được nhập từ một mô-đun chung.
Ngoài ra, afterhook sẽ chạy sau tất cả các thử nghiệm trong bộ. Điều này không thể được lặp lại với --recursive. Nếu bạn sử dụng --recursivevà thêm mã của aftermỗi mô-đun, nó sẽ được thực thi một lần cho mỗi mô-đun thay vì chỉ một lần cho toàn bộ bài kiểm tra.
Việc có tất cả các bài kiểm tra xuất hiện dưới một toptiêu đề duy nhất không thể được sao chép bằng cách sử dụng --recursive. Với --recursivemỗi tệp có thể có describe("top"nhưng điều này sẽ tạo ra một toptiêu đề mới cho mỗi tệp.
common.js:
var chai = require("chai");
var options = {
foo: "foo"
};
exports.options = options;
exports.chai = chai;
exports.assert = chai.assert;
Sử dụng một mô-đun có tên commonnhư thế này là điều tôi đã làm trong một số bộ thử nghiệm của mình để tránh phải requirelặp đi lặp lại nhiều thứ và giữ các biến hoặc hàm chỉ đọc toàn cục không giữ trạng thái. Tôi không muốn làm ô nhiễm globalđối tượng như trong câu trả lời của thgaskell vì đối tượng này thực sự là toàn cầu và có thể truy cập được ngay cả trong các thư viện của bên thứ ba mà mã của bạn có thể đang tải. Đây không phải là điều tôi thấy có thể chấp nhận được trong mã của mình.
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 () {});