Saya mencoba untuk menggabungkan semua tes dari beberapa file dalam satu file, seperti ini:
describe('Controllers', function() {
describe('messages.js', function() {
require('./controllertests/messages').test(options);
})
describe('users.js', function() {
require('./controllertests/users').test(options);
})
})
Saya cukup yakin ini bukan cara terbaik untuk mengikuti tes, saya kesulitan menemukan contoh bagaimana melakukan ini: s
node.js
unit-testing
mocha
coiso
sumber
sumber
.only()
, mungkin bergunadescribe.only()
untuk tetap menjalankan seluruh direktori pengujian. Itulah yang membawaku ke sini.Jawaban:
Jika Anda ingin menyertakan beberapa modul ke dalam Anda
describe
hierarki seperti yang Anda lakukan dalam pertanyaan Anda, apa yang Anda lakukan adalah cukup banyak itu , kecuali jika Anda ingin menulis tes kustom loader untuk Mocha. Menulis pemuat khusus tidak akan lebih mudah atau membuat kode Anda lebih jelas daripada yang sudah Anda miliki.Berikut adalah contoh bagaimana saya mengubah beberapa hal. The
test
subdirektori dalam contoh ini disusun sebagai: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"); }); });
The
importTest
fungsi hanya untuk menunjukkan bagaimana itu akan mungkin untuk menangani pengulangan mengimpor beberapa modul tanpa mengetik ulang seluruhdescribe(... require...
hal setiap saat. Thecommon
Modul ini dimaksudkan untuk menahan apa yang Anda butuhkan untuk digunakan dalam beberapa modul dari test suite. Sebenarnya saya tidak menggunakannyatop
tetapi bisa digunakan di sana, jika perlu.Saya akan mencatat di sini bahwa
beforeEach
akan menjalankan kodenya sebelum masing-masing dan setiap tes terdaftar denganit
apakah mereka muncul didescribe
dalamtop
atau mereka muncul di salah satu modul yang diimpor . Dengan--recursive
,beforeEach
kode harus disalin ke setiap modul atau mungkin Anda akan memilikibeforeEach
kaitan di setiap modul yang memanggil fungsi yang diimpor dari modul umum.Juga,
after
pengait akan berjalan setelah semua pengujian di suite. Ini tidak dapat direplikasi dengan--recursive
. Jika Anda menggunakan--recursive
dan menambahkan kodeafter
ke setiap modul, ini akan dijalankan satu kali per modul, bukan hanya sekali untuk keseluruhan pengujian.Memiliki semua tes yang muncul di bawah satu
top
judul tidak dapat direplikasi dengan menggunakan--recursive
. Dengan--recursive
setiap file bisa sajadescribe("top"
tapi ini akan membuattop
heading baru untuk tiap file.common.js
:var chai = require("chai"); var options = { foo: "foo" }; exports.options = options; exports.chai = chai; exports.assert = chai.assert;
Menggunakan modul bernama
common
seperti ini adalah sesuatu yang telah saya lakukan di beberapa rangkaian pengujian saya untuk menghindari keharusan untukrequire
banyak hal berulang-ulang dan untuk menahan variabel atau fungsi hanya-baca global yang tidak menjaga status. Saya memilih untuk tidak mencemariglobal
objek seperti dalam jawaban thgaskell karena objek ini benar-benar global dan dapat diakses bahkan di pustaka pihak ketiga yang mungkin memuat kode Anda. Ini bukanlah sesuatu yang menurut saya dapat diterima dalam kode saya.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 () {});
sumber
global
cakupan, saya menggunakan ini untuk pustaka pernyataan agar file pengujian tetap bersih. Ini tidak seperti Anda menimpaglobal.process
. Variabel lokal akan digantiglobal
kecuali pustaka lain secara eksplisit memanggilglobal.XYZ
yang tidak mungkin. Itu hanya berlangsung selama tes. Belum menyakiti saya, tapi saya akan memberi tahu Anda saat itu menggigit saya di pantat :)importTest
dan meneleponrequire('path')()
misalnya?importTest
Fungsinya hanyalah fungsi kenyamanan. Hal penting yang dilakukannya adalah membungkusrequire
panggilan dalam satudescribe
blok. Penting agarrequire
panggilan dibungkusdescribe
jika tidak modul tidak akan diisolasi di blok mereka sendiri dan setiap kait yang ditetapkan oleh file yang diimpor akan disetel pada blok yang salah. JikaimportTest
diganti dengan panggilan langsung kerequire
tanpa pembungkusdescribe
, maka modula/a
danb/b
kait akan berbagi. Misalnya,beforeEach
set hookb/b
juga akan berjalan sebelum setiap pengujian masuka/a
.Meskipun ini mungkin tidak terkait langsung dengan pertanyaan, jawaban yang saya cari adalah:
Akan menjalankan semua tes dalam sub direktori dari folder "test". Rapi. Menghemat keharusan memelihara daftar tes yang ingin saya muat dan sebenarnya selalu menjalankan semuanya.
sumber
describe
blok,describe
blok yang menjangkau file,--recursive
tidak akan melakukannya. Karena tidak menyelesaikan masalah OP, saya tidak akan menyebutnya "terbaik".describe
blokdescribe
blok. Lihat pertanyaannya.describe
Blok "Pengontrol" harus mencakup pengujian./controllertests/messages.js
dan./controllertests/users.js
. Menampar--recursive
doa Mocha tidak secara ajaib membuatdescribe("Controllers"
blok.describe
balok secara ajaib - yang sebenarnya saya pelajari dari Dumbledore sendiri.Tidak ada yang mencegah Anda menjalankan beberapa file uji. Umumnya, setiap pengujian tidak boleh bergantung pada hasil pengujian lain, jadi berbagi variabel bukanlah sesuatu yang ingin Anda lakukan.
Berikut adalah contoh bagaimana Anda dapat mengatur file pengujian Anda.
Kemudian di dalam
mocha.opts
file Anda , pastikan untuk mengatur--recursive
opsi.mocha.opts
Jika ada yang modul umum bahwa Anda ingin memasukkan seluruh file, Anda dapat menambahkan bahwa ke
common.js
berkas. File di roottest
direktori akan berjalan sebelum file di direktori bersarang.common.js
global.chai = require('chai'); global.assert = chai.assert; global.expect = chai.expect; chai.should(); chai.config.includeStack = true; process.env.NODE_ENV = 'test'; // Include common modules from your application that will be used among multiple test suites. global.myModule = require('../app/myModule');
sumber
describe('mytest', function() { /* ..... etc */ });
Saya tahu ini adalah posting lama tetapi saya ingin berpadu dengan apa yang telah menjadi solusi yang baik bagi saya, sangat mirip dengan metode yang diusulkan oleh OP.
Proyek yang saya kerjakan telah diuji dengan baik dan pengujiannya terus berkembang. Saya akhirnya menggunakan
require
karena sinkron dan karenanya membuatnya sedikit lebih mudah untuk menyusun pengujian Anda tanpa terlalu banyak perubahan dalam arsitektur:// inside test/index.js describe('V1 ROUTES', () => { require('./controllers/claims.test'); require('./controllers/claimDocuments.test'); require('./controllers/claimPhotos.test'); require('./controllers/inspections.test'); require('./controllers/inspectionPhotos.test'); require('./controllers/versions.test'); require('./services/login.v1.test'); }); describe('V2 ROUTES', () => { require('./services/login.v2.test'); require('./services/dec-image.v2.test'); }); describe('V3 ROUTES', () => { require('./services/login.v3.test'); require('./services/getInspectionPhotosv3.test'); require('./services/getPolicyInfo.v3.test'); }); describe('ACTIONS', () => { require('./actions/notifications.test'); });
sumber
Saya memiliki masalah serupa di mana saya memiliki banyak tes untuk kelas dalam kategori yang sama dan saya ingin mengelompokkannya bersama-sama untuk membuatnya lebih mudah dilihat dalam IDE. Semua tes dan kode saya sudah menggunakan modul ES6 - saya tidak ingin menulis ulang semuanya untuk digunakan
require
seperti yang saya lihat di contoh lain.Saya menyelesaikannya dengan
describe
mengekspor "pengelompokan" saya , lalu mengimpornya ke file pengujian saya dan secara terprogram menambahkannya ke yang diimpordescribe
. Saya akhirnya membuat metode pembantu untuk memisahkan semua pipa ledeng.Di someCategory.spec.js
const someCategory= describe("someCategory", () => {}); // Use this just like a regular `describe` to create a child of this scope in another file export default function describeMember(skillName, testFn) { return describe(skillName, function configureContext() { // Make context a child of `someCategory` context function Context() {} Context.prototype = someCategory.ctx; this.ctx = new Context(); // Re-parent the suite created by `describe` above (defaults to root scope of file it was created in) this.parent.suites.pop(); someCategory.addSuite(this); // Invoke the fn now that we've properly set up the parent/context testFn.call(this); }); }
Dalam tes individu:
import { default as describeCategoryMember } from './someCategory.spec'; describeCategoryMember('something', () => { describe('somethingElse', () => { ... }); it('a test', () => { ... }); })
sumber
describe( 'Running automation test, Please wait for all test to complete!'.red, function () { var run = require( './Test.js' ); for ( var i = 0; i < 2; i++ ) { run.badLogin(); run.loginLimited(); run.acceptJob(); run.drivingToJob(); run.arrivedAtJob(); run.towingJob(); run.arrivedDestination(); run.jobComplete(); run.restrictionLicensePlate(); run.newNodeMainMenu(); run.newNodeMainMenuToDrafts(); run.draftDelete(); run.resetAllData(); run.companyVehicle(); run.actionsScreenClockInOut(); run.mainMenuLogout(); run.loginAdmin(); run.actionsScreenLogout(); } } );
sumber
./Test.js
? Siapa tahu? Sebagai catatan, saat ini saya adalah penjawab pertanyaan teratas di tag moka . Saya tahu Mocha luar dalam tetapi saya tidak bisa memahami jawaban ini.