จะทำการทดสอบเดี่ยวกับ Mocha ได้อย่างไร


292

ฉันใช้ Mocha เพื่อทดสอบ JavaScript ของฉัน ไฟล์ทดสอบของฉันมี 5 การทดสอบ เป็นไปได้หรือไม่ที่จะรันการทดสอบเฉพาะ (หรือชุดการทดสอบ) แทนการทดสอบทั้งหมดในไฟล์?

คำตอบ:


356

ลองใช้ตัวเลือกของมอคค่า--grep :

    -g, --grep <pattern>            only run tests matching <pattern>

คุณสามารถใช้ regex JavaScript ใด ๆ <pattern>ที่ถูกต้องเป็น ตัวอย่างเช่นถ้าเรามีtest/mytest.js:

it('logs a', function(done) {
  console.log('a');
  done();
});

it('logs b', function(done) {
  console.log('b');
  done();
});

แล้ว:

$ mocha -g 'logs a'

เพื่อรันการทดสอบเดียว โปรดทราบว่าสิ่งนี้ greps ในชื่อของทั้งหมดdescribe(name, fn)และit(name, fn)การร้องขอ

พิจารณาใช้การdescribe()โทรที่ซ้อนกันสำหรับการกำหนดเนมสเปซเพื่อให้ง่ายต่อการค้นหาและเลือกชุดเฉพาะ


1
ขอบคุณ! ฉันอยู่ภายใต้การแสดงผลที่--grepกรองจาก@แท็กเท่านั้น
kumarharsh

5
เมื่อใช้ Mocha โดยทางโปรแกรม (ตัวอย่างจาก Grunt) มีตัวเลือกจับ: ตัวเลือก grep ต้องเป็นวัตถุ´RegExp () ´ ถ้ามันเป็นสตริงมันจะหนีออกมา
h-kippo

1
นี่เป็นทางออกเดียวที่ได้ผลสำหรับฉัน การระบุไฟล์ในบรรทัดคำสั่ง ( mocha some/test.js) ไม่ทำงานเลย ขอบคุณ!
hraban

2
มีวิธีใดที่จะหลีกเลี่ยงการใช้งานlogs a bcdซึ่งประกอบด้วยlogs aซับสตริงหรือไม่ Regexp ^$ไม่ทำงานใน 0.10.2
Ciro Santilli 郝海东冠状病六四事件法轮功

ขอบคุณฉันได้รับข้อผิดพลาดบางอย่างถ้าฉันไม่ได้ระบุไดเรกทอรีเป็น mocha -g 'บันทึก'
kta

167

ทั้งนี้ขึ้นอยู่กับรูปแบบการใช้งานของคุณคุณอาจเพียงแค่ต้องการใช้เท่านั้น เราใช้สไตล์ TDD; ดูเหมือนว่านี้:

test.only('Date part of valid Partition Key', function (done) {
    //...
}

เฉพาะการทดสอบนี้เท่านั้นที่จะเรียกใช้จากไฟล์ / ชุดโปรแกรมทั้งหมด


5
BDD ทำงานเหมือนกัน สิ่งนี้เป็นสิ่งที่ดีสำหรับเมื่อคุณกำลังทำการทดสอบเดี่ยว นอกจากนี้ยังสามารถใช้งานได้ที่ชุด / อธิบายระดับ
andyzinsser

14
it.onlyกับชัยและคาดว่าไวยากรณ์ที่จะเป็น
elkelk

4
คำตอบนี้จะดีกว่าเพราะมันจะทำงานเมื่อใช้มอคค่าจากภายในกรรม ฯลฯ
Vivek Kodira

2
it.onlyจะไม่ทำงานร่วมกับgivenของมอคค่า testdata และง่ายต่อการลืมที่จะลบในภายหลัง
Tr1et

4
eslint-plugin-mochaมีกฎที่จะจับคุณถ้าคุณลืมลบno-exclusive-tests .only
dostu

84

หากคุณกำลังใช้npm test(ใช้สคริปต์ package.json) ใช้ส่วนพิเศษ--เพื่อส่งพารามิเตอร์ผ่านไปยังมอคค่า

เช่น npm test -- --grep "my second test"

แก้ไข : ดูเหมือน--grepจะยุ่งเล็กน้อย (อาจขึ้นอยู่กับข้อโต้แย้งอื่น ๆ ) คุณสามารถ:

แก้ไข package.json:

"test:mocha": "mocha --grep \"<DealsList />\" .",

หรือใช้อีกทางเลือกหนึ่ง--bailซึ่งดูเหมือนว่าจะจุกจิกน้อยลง

npm test -- --bail

3
ทำงานให้ฉัน ขอบคุณ :)
Jill-Jênn Vie

1
@Andy --grep สามารถจุกจิกเล็กน้อย - ลองวางไว้หลังมอคค่าในรายการสคริปต์ npm อื่นnpm test -- --bailมีประโยชน์สำหรับการประกันตัวหลังจากการทดสอบครั้งแรกล้มเหลว
Ashley Coolman

1
ผ่านเครื่องหมายขีดคั่นพิเศษก่อน--grepบันทึกวันของฉัน! ขอบคุณมาก. PS ฉันใช้ Windows ทำงานอยู่npm test -- --grep @tag
Mykola

18

เรียกใช้การทดสอบเดียว - โดยชื่อไฟล์ -

ที่จริงแล้วหนึ่งสามารถรันการทดสอบมอคค่าเดียวโดยใช้ชื่อไฟล์ (ไม่ใช่แค่„ it () - string-grepping“) หากคุณลบรูปแบบ glob (เช่น./test/**/*.spec.js) ออกจาก mocha.opts ของคุณตามลำดับสร้างสำเนาโดยไม่มี:

node_modules/.bin/mocha --opts test/mocha.single.opts test/self-test.spec.js

นี่คือ mocha.single.opts ของฉัน (มันแตกต่างกันเฉพาะในการหายไปของสาย glob ดังกล่าว)

--require ./test/common.js
--compilers js:babel-core/register
--reporter list
--recursive

พื้นหลัง:ในขณะที่คุณสามารถแทนที่สวิทช์ต่างๆจาก opts ไฟล์ (เริ่มต้นด้วย--) คุณไม่สามารถแทนที่ glob ลิงค์นั้นยังมีคำอธิบายบางอย่าง

คำแนะนำ:หากnode_modules/.bin/mochaคุณสับสนให้ใช้มอคค่าแพ็คเกจในท้องที่ คุณสามารถเขียนได้mochaถ้าคุณติดตั้งไว้ทั่วโลก


และถ้าคุณต้องการความสะดวกสบายของpackage.json: ยัง: ลบ**/*-ish glob จากคุณmocha.optsใส่พวกเขาที่นี่สำหรับการทดสอบทั้งหมดปล่อยพวกเขาออกไปสำหรับการทดสอบเดียว:

"test": "mocha ./test/**/*.spec.js",
"test-watch": "mocha -R list -w ./test/**/*.spec.js",
"test-single": "mocha $1",
"test-single-watch": "mocha -R list -w $1",

การใช้งาน:

> npm run test

ตามลำดับ

> npm run test-single -- test/ES6.self-test.spec.js 

(ใจ--!)


$ 1 ไม่จำเป็นในการตั้งค่าของฉัน แต่มันนำไปสู่คำเตือนเช่น: Warning: Could not find any test files matching pattern: $1
Merijn Vogel

15

เพียงใช้. ก่อนที่จะ 'อธิบาย', 'มัน' หรือ 'บริบท' ฉันรันโดยใช้ "$ npm run test: unit" และรันเฉพาะหน่วยด้วย. only

describe.only('get success', function() {
 // ...
});

it.only('should return 1', function() {
  // ...
});

11

การแก้ปัญหาข้างต้นไม่ได้ผลสำหรับฉัน อีกวิธีหนึ่งในการรันการทดสอบเดียวคือ

mocha test/cartcheckout/checkout.js -g 'Test Name Goes here'

สิ่งนี้ช่วยในการรันกรณีทดสอบจากไฟล์เดียวและมีชื่อเฉพาะ


1
ใช้นิพจน์ที่เลือกได้เพียงพอ-gและคุณไม่จำเป็นต้องระบุชื่อไฟล์ หากคุณไม่สามารถเขียนนิพจน์ที่เลือกได้เพียงพอนั่นหมายความว่าคุณไม่ได้ตั้งชื่อการทดสอบอย่างเหมาะสม
หลุยส์


8

คุณสามารถลอง "เท่านั้น"

 it.only('Test one ', () => {

            expect(x).to.equal(y);
        });
it('Test two ', () => {

            expect(x).to.equal(y);
        });

ในนี้คนแรกเท่านั้นที่จะดำเนินการ


2
อันตรายหากการทดสอบไม่ถูกดำเนินการผ่านทาง--forbid-onlyCI / บิลด์เซิร์ฟเวอร์ .onlyมีแนวโน้มที่จะแอบเข้าไปในสาขาหลักและทำให้การทดสอบอื่น ๆ ไม่ทำงานเนื่องจากพวกเขาจะไม่ทำงานอีกต่อไป ฉันคิดว่าเวิร์กโฟลว์ของการเปลี่ยนรหัสเพื่อเรียกใช้การทดสอบที่แตกต่างกันต่อต้านคุณสมบัติ ผู้ทดสอบควรกำหนดว่าการทดสอบใดที่ควรดำเนินการ (หรือที่รู้จักว่าการทดสอบที่ติดแท็ก) ไม่ใช่นักพัฒนา
k0pernikus

ฉันใช้สิ่งนี้เพื่อทดสอบฟังก์ชั่นเดียวในท้องที่ของฉันหมายเหตุ: อย่าส่งรหัสด้วยit.onlyเพื่อซื้อคืน
Bikesh M


0

ไม่แน่ใจว่าทำไมวิธี grep ไม่ทำงานสำหรับฉันเมื่อใช้การทดสอบ npm งานนี้แม้ว่า ฉันยังต้องระบุโฟลเดอร์ทดสอบด้วยเหตุผลบางอย่าง

ทดสอบ npm - ทดสอบ / sometest.js


0

รวมการทดสอบทั้งหมดของคุณไว้ในไฟล์ test.js หนึ่งไฟล์และแพ็คเกจ json ของคุณเพิ่มสคริปต์เป็น:

  "scripts": {
  "api:test": "node_modules/.bin/mocha --timeout 10000 --recursive api_test/"
},

พิมพ์คำสั่งในไดเรกทอรีทดสอบของคุณ:

npm run api:test
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.