Nếu bạn muốn bao gồm nhiều mô-đun vào bạn describe
phâ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ư test
mụ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 importTest
chứ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 common
mô-đ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 top
nhưng nó có thể được sử dụng ở đó, nếu cần.
Tôi sẽ lưu ý ở đây rằng beforeEach
sẽ chạy mã của nó trước mỗi và mọi thử nghiệm đơn lẻ được đăng ký với it
việc chúng xuất hiện bên describe
trong top
hoặc chúng xuất hiện trong bất kỳ mô-đun nào được nhập . Với --recursive
, beforeEach
mã sẽ phải được sao chép vào từng mô-đun hoặc có lẽ bạn sẽ có một beforeEach
hook trong mỗi mô-đun gọi một hàm được nhập từ một mô-đun chung.
Ngoài ra, after
hook 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 --recursive
và thêm mã của after
mỗ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 top
tiêu đề duy nhất không thể được sao chép bằng cách sử dụng --recursive
. Với --recursive
mỗi tệp có thể có describe("top"
nhưng điều này sẽ tạo ra một top
tiê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 common
như 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 require
lặ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 () {});